A Stream Collectors a Java 8 Stream API hatékony funkciója, amely lehetővé teszi az adatok hatékony gyűjtését és feldolgozását. Itt elmagyarázzuk azok felépítését és a Java collect() metódus használatát.

Hogyan használható a Java collect() funkció?

A Stream Collector segítségével lista, halmaz vagy térkép hozható létre egy streamből. A stream egymás után feldolgozott elemek sorozata. A Collector felület egy sor redukciós műveletet biztosít a stream pipeline-ban található adatokhoz. Ezek végső műveletek, amelyek összegyűjtik és egyesítik a közbenső lépések eredményeit.

A gyűjtők segítségével szűrhetők vagy rendezhetők a stream objektumai. Összesítés is lehetséges, például számok összegzése, karakterláncok kombinálása vagy elemek számlálása. Ezenkívül a gyűjtők rendelkeznek olyan funkciókkal, amelyek a stream tartalmát egy adott struktúrába alakíthatják át. Például egy listát térképpé alakíthat. A csoportosítások segítenek bizonyos tulajdonságokkal vagy feltételekkel rendelkező elemek kategorizálásában. A legfontosabb, hogy a stream gyűjtőknek az az előnyük, hogy több szálat használva egyszerre tudnak adatokat feldolgozni. Ez lehetővé teszi a műveletek sokkal gyorsabb és hatékonyabb végrehajtását, különösen nagy adatmennyiségek esetén.

Mi a Java collect() szintaxisa?

A módszer argumentumként elfogad egy Collector-t, amely leírja, hogyan kell a stream elemeit összegyűjteni és összesíteni. A Collector egy interfész, amely különböző módszereket biztosít a stream elemeinek egy adott formába, például listába, halmazba vagy térképbe történő összesítéséhez.

A Java Stream collect() metódusnak két változata létezik:

  1. R collect(Supplier<R> szállító, BiConsumer<R, ? super T> akkumulátor, BiConsumer<R, R> kombinátor)
  2. <R, A> R collect(Collector<? super T, A, R> collector)

Az első változat három függvényt tartalmaz argumentumként:

  • szolgáltató: létrehoz egy konténert, amelyet a közbenső eredmények tárolására használnak
  • akkumulátor: kiszámítja a végső eredményt
  • kombinátor: egyesíti a párhuzamos stream műveletek eredményeit

Ezek az előre definiált gyűjtők már szerepelnek a standard könyvtárban, és könnyen importálhatók és használhatók.

A második változat egy Collector-t fogad el argumentumként, és eredményt ad vissza.

  • R: az eredmény típusa
  • T: a stream elemeinek típusa
  • A: a gyűjtő művelet közbenső állapotát tároló akkumulátor típusa
  • gyűjtő: végrehajtja a redukciós műveletet.

Ezzel a változat használatával a fejlesztők olyan egyedi gyűjtőket hozhatnak létre, amelyek kifejezetten az igényeikhez igazodnak, és nagyobb rugalmasságot és ellenőrzést biztosítanak a redukciós folyamat felett.

Melyek a Java collect() használatának gyakorlati példái?

Az alábbiakban bemutatjuk a Stream.collect() módszer különböző funkcióit. Mielőtt belevágna a gyűjteménykeretrendszerbe, már ismernie kell az alapvető Java operátorokat.

Karaktersorozatok listájának összefűzése

A Java Collect() segítségével összefűzhetünk egy karakterláncokból álló listát, hogy egy új karakterláncot kapjunk:

List<String> letters = List.of("a", "b", "c", "d", "e");
// without combiner function
StringBuilder result = letters.stream().collect(StringBuilder::new, (x, y) -> x.append(y),
    (a, b) -> a.append(",").append(b));
System.out.println(result.toString());
// with combiner function
StringBuilder result1 = letters.parallelStream().collect(StringBuilder::new, (x, y) -> x.append(y),
    (a, b) -> a.append(",").append(b));
System.out.println(result1.toString());
Java

A kimenet:

abcde
a, b, c, d, e
Java

Az első számításban csak egy StringBuilder példányt használtunk, és nem volt kombináló függvény. Ezért az eredmény abcde.

A második kimenetben a kombináló funkció egyesítette a StringBuilder példányokat, és vesszővel választotta el őket egymástól.

Elemek gyűjtése egy listába a toList() segítségével

A filter() függvény segítségével kiválaszthatjuk a lista bizonyos elemeit, majd toList() segítségével elmenthetjük őket egy új listába.

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
List<Integer> oddNumbers = numbers.stream().filter(x -> x % 2 != 0).collect(Collectors.toList());
System.out.println(oddNumbers);
Java

Az új listában csak páratlan számok vannak:

[1, 3, 5, 7]
Java

Elemek gyűjtése egy halmazba a toSet() segítségével

Hasonlóképpen, kiválaszthatunk elemeket, és azokból új halmazt hozhatunk létre. A halmaz elemeinek nem kell meghatározott sorrendben elrendezniük.

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
Set<Integer> evenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
System.out.println(evenNumbers);
Java

Ez a következő kimenetet jeleníti meg:

[2, 4, 6]
Java

Elemek gyűjtése egy térképen a toMap() segítségével

A térkép a Java collect() parancsával együtt használható, hogy minden kulcshoz értéket rendeljen.

List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
Map<Integer, String> mapEvenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0)
    .collect(Collectors.toMap(Function.identity(), x -> String.valueOf(x)));
System.out.println(mapEvenNumbers);
Java

A kimenetben láthatjuk, hogy a bemenetben szereplő minden páros számhoz azonos érték lett hozzárendelve:

{2=2, 4=4, 6=6}
Java

Elemek összekapcsolása egy karakterláncban a joining() segítségével

A joining() módszer a stream elemeit megjelenésük sorrendjében egyesíti, és elválasztójelet használ az elemek elválasztására. Az elválasztójelet argumentumként adja át joining(). Ha nincs megadva elválasztójel, joining() az üres karakterláncot használja ""

jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));
Java

Az eredmények a következők:

result1 ==> "abc"
result2 ==> "{a,b,c}"
Java
Ugrás a főmenübe