Unisciti a Array of Primitives con Separator in Java

1. Introduzione

In questo rapido tutorial, impareremo come unire un array di primitive con un separatore a carattere singolo in Java . Per i nostri esempi, considereremo due array: un array di int e un array di char .

2. Definizione del problema

Iniziamo definendo un array di int e un array di char per gli esempi, così come il carattere separatore che useremo per unire i loro contenuti:

int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'}; char separatorChar = '-'; String separator = String.valueOf(separatorChar); 

Nota che abbiamo incluso sia un separatore char che uno String poiché alcuni dei metodi che mostreremo richiedono un argomento char , mentre altri richiedono un argomento String .

I risultati dell'operazione di unione conterranno "1-2-3-4-5-6-7-8-9" per l' array int e "abcdef" per l' array char .

3. Collectors.joining ()

Cominciamo con uno dei metodi disponibili dall'API Java 8 Stream: Collectors.joining () .

Per prima cosa, creiamo un flusso da un array di primitive utilizzando il metodo Arrays.stream () trovato nel pacchetto java.util . Successivamente, mappiamo ogni elemento su String . E infine, concateniamo gli elementi con il nostro separatore dato.

Cominciamo con il nostro array int :

String joined = Arrays.stream(intArray) .mapToObj(String::valueOf) .collect(Collectors.joining(separator));

Quando uniamo il nostro array di caratteri con questo metodo, dobbiamo prima avvolgere l' array di caratteri in CharBuffer e quindi proiettarlo di nuovo su char . Questo perché il metodo chars () restituisce un flusso di valori int .

Sfortunatamente, l'API Java Stream non fornisce un metodo nativo per il wrapping di un flusso di caratteri .

Uniamo il nostro array di caratteri :

String joined = CharBuffer.wrap(charArray).chars() .mapToObj(intValue -> String.valueOf((char) intValue)) .collect(Collectors.joining(separator));

4. StringJoiner

Analogamente a Collectors.joining () , questo approccio fa uso dell'API Stream, ma invece di raccogliere elementi, itera attraverso gli elementi e li aggiunge a un'istanza StringJoiner :

StringJoiner intStringJoiner = new StringJoiner(separator); Arrays.stream(intArray) .mapToObj(String::valueOf) .forEach(intStringJoiner::add); String joined = intStringJoiner.toString();

Ancora una volta, dobbiamo avvolgere il nostro array di caratteri in CharBuffer quando si utilizza l'API Stream:

StringJoiner charStringJoiner = new StringJoiner(separator); CharBuffer.wrap(charArray).chars() .mapToObj(intChar -> String.valueOf((char) intChar)) .forEach(charStringJoiner::add); String joined = charStringJoiner.toString();

5. Apache Commons Lang

La libreria Apache Commons Lang fornisce alcuni metodi utili nelle classi StringUtils e ArrayUtils che possiamo usare per unire i nostri array primitivi.

Per utilizzare questa libreria, dovremo aggiungere la dipendenza commons-lang3 al nostro pom.xml :

 org.apache.commons commons-lang3 3.8.1 

Quando lavoriamo con un separatore di stringa , utilizzeremo sia StringUtils che ArrayUtils .

Usiamoli insieme per unire il nostro array int :

String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);

Oppure, se stiamo usando un tipo char primitivo come separatore, possiamo semplicemente scrivere:

String joined = StringUtils.join(intArray, separatorChar);

Le implementazioni per unirsi al nostro array di caratteri sono abbastanza simili:

String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);

E quando si utilizza un separatore di caratteri :

String joined = StringUtils.join(charArray, separatorChar);

6. Guava

La libreria Guava di Google fornisce la classe Joiner che possiamo utilizzare per unire i nostri array. Per utilizzare Guava nel nostro progetto, dobbiamo aggiungere la dipendenza Guava Maven:

 com.google.guava guava 27.0.1-jre 

Uniamo il nostro array int usando la classe Joiner :

String joined = Joiner.on(separator).join(Ints.asList(intArray));

In questo esempio, abbiamo anche utilizzato il metodo Ints.asList () di Guava, che trasforma piacevolmente l'array di primitive in un List of Integer .

Guava offre un metodo simile per convertire un array di caratteri in un elenco di caratteri. Di conseguenza, l'unione del nostro array char assomiglia molto all'esempio precedente che utilizzava l' array int :

String joined = Joiner.on(separator).join(Chars.asList(charArray));

7. StringBuilder

Infine, se non possiamo utilizzare Java 8 o librerie di terze parti, possiamo unire manualmente un array di elementi con StringBuilder . In questo caso, l'implementazione è identica per entrambi i tipi di array:

if (array.length == 0) { return ""; } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < array.length - 1; i++) { stringBuilder.append(array[i]); stringBuilder.append(separator); } stringBuilder.append(array[array.length - 1]); String joined = stringBuilder.toString();

8. Conclusione

Questo rapido articolo illustra diversi modi per unire un array di primitive con un dato carattere separatore o stringa. Abbiamo mostrato esempi utilizzando soluzioni JDK native, nonché soluzioni aggiuntive utilizzando due librerie di terze parti: Apache Commons Lang e Guava.

Come sempre, il codice completo utilizzato in questo articolo è disponibile su GitHub.