Stream.concat în Java

Lipește două stream-uri: întâi toate elementele primului, apoi pe ale celui de-al doilea.

Sintaxă
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

Ce face Stream.concat

Stream.concat(a, b) creează un stream nou care conține elementele lui a, urmate de elementele lui b. Stream-urile primite nu mai pot fi folosite separat după aceea.

Metoda primește exact două stream-uri. Pentru mai multe, poți apela concat de mai multe ori sau poți folosi Stream.of(a, b, c).flatMap(s -> s), care este mai eficient pentru un număr mare de stream-uri.

Parametri

Parametru Descriere
a Primul stream; elementele lui apar primele.
b Al doilea stream; elementele lui apar după cele din a.

Ce returnează

Un Stream<T> cu elementele lui a și apoi ale lui b.

Exemple

Exemplul 1: Două grupe într-o singură listă

import java.util.List;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<String> grupaA = List.of("Ana", "Bogdan");
        List<String> grupaB = List.of("Carmen", "Dan", "Elena");

        List<String> toti = Stream.concat(grupaA.stream(), grupaB.stream()).toList();
        System.out.println(toti);
        System.out.println("Total studenți: " + toti.size());
    }
}

Rezultat

[Ana, Bogdan, Carmen, Dan, Elena]
Total studenți: 5

Exemplul 2: Trei surse de date

Pentru mai mult de două stream-uri, flatMap le lipește pe toate dintr-o dată.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<String> moldova = Stream.of("Iași", "Suceava");
        Stream<String> ardeal = Stream.of("Cluj", "Sibiu");
        Stream<String> banat = Stream.of("Timișoara");

        // varianta cu concat de două ori
        System.out.println(Stream.concat(Stream.concat(moldova, ardeal), banat).toList());

        // varianta cu flatMap
        System.out.println(Stream.of(Stream.of("A", "B"), Stream.of("C"), Stream.of("D", "E"))
                .flatMap(s -> s)
                .toList());
    }
}

Rezultat

[Iași, Suceava, Cluj, Sibiu, Timișoara]
[A, B, C, D, E]

Greșeli frecvente

  • Folosești din nou stream-urile a sau b după concat. Ele au fost consumate; creează stream-uri noi.
  • Imbrici foarte multe apeluri concat într-o buclă. Poate duce la StackOverflowError; folosește flatMap.

Comenzi înrudite

  • Stream.of: Creează un stream direct din câteva valori; ofNullable face un stream gol pentru null, iar empty un stream fără elemente.
  • Stream.flatMap: Transformă fiecare element într-un stream și lipește toate aceste stream-uri într-unul singur.
  • Stream.builder: Construiește un stream element cu element, cu add(), și îl închide cu build().