Hogyan lehet a Java collect() parancsot használni adatok gyűjtésére és feldolgozására?
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:
- R collect(Supplier<R> szállító, BiConsumer<R, ? super T> akkumulátor, BiConsumer<R, R> kombinátor)
- <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());JavaA kimenet:
abcde
a, b, c, d, eJavaAz 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);JavaAz új listában csak páratlan számok vannak:
[1, 3, 5, 7]JavaElemek 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);JavaEz a következő kimenetet jeleníti meg:
[2, 4, 6]JavaElemek 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);JavaA kimenetben láthatjuk, hogy a bemenetben szereplő minden páros számhoz azonos érték lett hozzárendelve:
{2=2, 4=4, 6=6}JavaElemek ö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(",", "{", "}"));JavaAz eredmények a következők:
result1 ==> "abc"
result2 ==> "{a,b,c}"Java