Java 8 StringJoiner

1. Introduzione

StringJoiner è una nuova classe aggiunta in Java 8 nel pacchetto java.util .

In poche parole, può essere utilizzato per unire stringhe utilizzando un delimitatore, prefisso e suffisso.

2. Aggiunta di elementi

Possiamo aggiungere stringhe usando il metodo add () :

@Test public void whenAddingElements_thenJoinedElements() { StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX); joiner.add("Red") .add("Green") .add("Blue"); assertEquals(joiner.toString(), "[Red,Green,Blue]"); }

Se vogliamo unire tutti gli elementi di una lista, dovremo scorrere la lista. Sfortunatamente, non esiste un modo semplice per farlo usando StringJoiner :

@Test public void whenAddingListElements_thenJoinedListElements() { List rgbList = new ArrayList(); rgbList.add("Red"); rgbList.add("Green"); rgbList.add("Blue"); StringJoiner rgbJoiner = new StringJoiner( ",", PREFIX, SUFFIX); for (String color : rgbList) { rgbJoiner.add(color); } assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]"); }

3. Costruzione

Per costruire un'istanza di StringJoiner, dobbiamo menzionare il delimitatore. Facoltativamente, possiamo anche specificare il prefisso e il suffisso che dovrebbero essere presenti nel risultato:

private String PREFIX = "["; private String SUFFIX = "]"; @Test public void whenEmptyJoinerWithoutPrefixSuffix_thenEmptyString() { StringJoiner joiner = new StringJoiner(","); assertEquals(0, joiner.toString().length()); } @Test public void whenEmptyJoinerJoinerWithPrefixSuffix_thenPrefixSuffix() { StringJoiner joiner = new StringJoiner( ",", PREFIX, SUFFIX); assertEquals(joiner.toString(), PREFIX + SUFFIX); }

Usiamo toString () per ottenere il valore corrente dal joiner.

Nota i valori predefiniti restituiti dai falegnami. Un joiner senza prefisso e suffisso restituisce una stringa vuota mentre joiner con prefisso e suffisso restituisce una stringa contenente sia prefisso che suffisso.

Possiamo cambiare la stringa predefinita restituita usando setEmptyValue () :

@Test public void whenEmptyJoinerWithEmptyValue_thenDefaultValue() { StringJoiner joiner = new StringJoiner(","); joiner.setEmptyValue("default"); assertEquals(joiner.toString(), "default"); } @Test public void whenEmptyJoinerWithPrefixSuffixAndEmptyValue_thenDefaultValue() { StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX); joiner.setEmptyValue("default"); assertEquals(joiner.toString(), "default"); }

Qui, entrambi i joiners restituiscono la costante EMPTY_JOINER .

Il valore predefinito viene restituito solo quando StringJoiner è vuoto.

4. Unisci falegnami

Possiamo unire due falegnami usando merge () . Aggiunge il contenuto del dato StringJoiner senza prefisso e suffisso come elemento successivo:

@Test public void whenMergingJoiners_thenReturnMerged() { StringJoiner rgbJoiner = new StringJoiner( ",", PREFIX, SUFFIX); StringJoiner cmybJoiner = new StringJoiner( "-", PREFIX, SUFFIX); rgbJoiner.add("Red") .add("Green") .add("Blue"); cmybJoiner.add("Cyan") .add("Magenta") .add("Yellow") .add("Black"); rgbJoiner.merge(cmybJoiner); assertEquals( rgbJoiner.toString(), "[Red,Green,Blue,Cyan-Magenta-Yellow-Black]"); }

Notare come "-" è usato per concatenare il contenuto di cmybJoiner mentre rgbJoiner usa ancora ",".

5. Stream API

Questo è praticamente tutto ciò che possiamo fare con StringJoiner .

C'è un altro utilizzo indiretto che può essere trovato nell'API Stream :

@Test public void whenUsedWithinCollectors_thenJoined() { List rgbList = Arrays.asList("Red", "Green", "Blue"); String commaSeparatedRGB = rgbList.stream() .map(color -> color.toString()) .collect(Collectors.joining(",")); assertEquals(commaSeparatedRGB, "Red,Green,Blue"); }

Collectors.joining () utilizza internamente StringJoiner per eseguire l'operazione di unione.

6. Conclusione

In questo breve tutorial, abbiamo illustrato come utilizzare la classe StringJoiner . Nel complesso StringJoiner sembra molto primitivo e non riesce ad affrontare alcuni casi d'uso di base come l'unione degli elementi di un elenco. Sembra essere progettato principalmente per i collezionisti .

Se StringJoiner non soddisfa i nostri requisiti, esistono altre librerie popolari e potenti, come Guava .

E, come al solito, tutte le fonti possono essere trovate su GitHub.