Collectors.joining în Java

Unește textele din stream într-un singur String, cu un separator și, opțional, un început și un sfârșit.

Sintaxă
static Collector<CharSequence, ?, String> joining()
static Collector<CharSequence, ?, String> joining(CharSequence separator)
static Collector<CharSequence, ?, String> joining(CharSequence separator, CharSequence prefix, CharSequence sufix)

Ce face Collectors.joining

Collectors.joining() lipește textele unul după altul. Cu un separator, joining(", "), pune textul dat între elemente, dar nu și după ultimul, așa că nu mai trebuie să ștergi virgula de la final.

Varianta cu trei argumente adaugă un prefix și un sufix: joining(", ", "[", "]"). Prefixul și sufixul apar și când stream-ul este gol (rezultatul este "[]").

Elementele trebuie să fie texte (CharSequence). Pentru numere sau obiecte, transformă-le înainte cu map(String::valueOf) sau map(Object::toString).

Parametri

Parametru Descriere
separator Textul pus între elemente.
prefix Textul de la început.
sufix Textul de la sfârșit.

Ce returnează

Un Collector care produce un String.

Exemple

Exemplul 1: Liste de nume, cu și fără separator

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> nume = List.of("Ana", "Mihai", "Elena");

        System.out.println(nume.stream().collect(Collectors.joining()));
        System.out.println(nume.stream().collect(Collectors.joining(", ")));
        System.out.println(nume.stream().collect(Collectors.joining(", ", "Prezenți: ", ".")));
        System.out.println(List.<String>of().stream().collect(Collectors.joining(", ", "[", "]")));
    }
}

Rezultat

AnaMihaiElena
Ana, Mihai, Elena
Prezenți: Ana, Mihai, Elena.
[]

Exemplul 2: Numere unite într-un rând CSV

Notele sunt Integer, deci le transformăm în text cu map(String::valueOf) înainte de joining.

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = List.of(9, 10, 7, 8);
        String rand = note.stream().map(String::valueOf).collect(Collectors.joining(";"));
        System.out.println("Ana;" + rand);
    }
}

Rezultat

Ana;9;10;7;8

Greșeli frecvente

  • Aplici joining pe un stream de numere: codul nu compilează. Adaugă map(String::valueOf).
  • Construiești textul cu += într-o buclă și ștergi apoi ultima virgulă. joining(", ") face asta corect dintr-o dată.

Comenzi înrudite

  • Collectors: Clasa cu rețete gata făcute pentru collect: liste, mulțimi, map-uri, texte unite, grupări, numărări și medii.
  • Stream.map: Transformă fiecare element al stream-ului în altă valoare, eventual de alt tip.
  • String.join: Lipește mai multe șiruri într-unul singur, cu un separator între ele (opusul lui split).
  • Stream.collect: Adună elementele într-un rezultat (listă, set, map, text) folosind un Collector, de obicei din clasa Collectors.