Jak používat funkci Java collect() ke sběru a zpracování dat
Stream Collectors jsou výkonnou funkcí v Java 8 Stream API, která umožňuje efektivně shromažďovat a zpracovávat data. Zde vysvětlíme jejich strukturu a jak lze použít metodu Java collect().
Jak lze použít funkci Java collect()?
Stream Collector lze použít k vytvoření seznamu, sady nebo mapy ze streamu. Stream je posloupnost prvků, které jsou zpracovávány jeden po druhém. Rozhraní Collector poskytuje sadu redukčních operací pro data v potrubí streamu. Jedná se o terminální operace, které shromažďují a slučují výsledky mezikroků.
Sběrače lze použít k filtrování nebo třídění objektů ze streamu. Je také možné provádět agregaci, například sčítání čísel, kombinování řetězců nebo počítání prvků. Kromě toho mají sběrače funkce, které mohou transformovat obsah streamu do konkrétní struktury. Můžete například transformovat seznam na mapu. Seskupení pomáhají kategorizovat prvky s určitými vlastnostmi nebo podmínkami. Nejdůležitější výhodou streamových kolektorů je, že mohou zpracovávat data současně pomocí více vláken. To umožňuje provádět operace mnohem rychleji a efektivněji, zejména u velkých objemů dat.
Jaká je syntaxe pro Java collect()?
Metoda přijímá jako argument Collector, který popisuje, jak mají být prvky proudu shromažďovány a agregovány. Collector je rozhraní, které poskytuje různé metody pro agregaci prvků proudu do konkrétní formy, například do seznamu, sady nebo mapy.
Existují dvě varianty metody collect() v jazyře Java Stream:
- R collect(Supplier<R> dodavatel, BiConsumer<R, ? super T> akumulátor, BiConsumer<R, R> kombinátor)
- <R, A> R collect(Collector<? super T, A, R> collector)
První varianta má tři funkce jako argumenty:
- dodavatel: vytvoří kontejner, který bude použit pro průběžné výsledky
- akumulátor: vypočítá konečný výsledek
- kombinátor: kombinuje výsledky paralelních operací proudu
Tyto předdefinované kolektory jsou již součástí standardní knihovny a lze je snadno importovat a používat.
Druhá varianta přijímá jako argument Collector a vrací výsledek.
- R: typ výsledku
- T: typ prvků v proudu
- A: typ akumulátoru, který ukládá mezistav operace kolektoru
- kolektor: provádí redukční operaci.
Pomocí této varianty mohou vývojáři vytvářet přizpůsobené kolektory, které jsou specificky přizpůsobeny jejich požadavkům a poskytují větší flexibilitu a kontrolu nad procesem redukce.
Jaké jsou praktické příklady použití metody Java collect()?
Níže ilustrujeme různé funkce metody Stream.collect(). Než se pustíte do studia kolekčního frameworku, měli byste se seznámit se základními operátory jazyka Java.
Spojit seznam řetězců
Pomocí Java Collect() můžeme zřetězit seznam řetězců a získat nový řetězec:
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());JavaVýstup je:
abcde
a, b, c, d, eJavaV prvním výpočtu byla použita pouze jedna instance StringBuilder a nebyla použita žádná kombinovaná funkce. Proto je výsledek abcde.
Ve druhém výstupu funkce combiner sloučila instance StringBuilder a oddělila je čárkou.
Shromažďujte prvky do seznamu pomocí toList()
Pomocí funkce filter() můžeme vybrat určité prvky seznamu a poté je pomocí toList() uložit do nového seznamu.
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);JavaV novém seznamu jsou pouze lichá čísla:
[1, 3, 5, 7]JavaShromažďujte prvky v sadě pomocí toSet()
Podobně můžeme vybrat prvky a vytvořit z nich novou množinu. Prvky v množině nemusí být uspořádány v určitém pořadí.
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);JavaZobrazí se následující výstup:
[2, 4, 6]JavaShromažďujte prvky v mapě pomocí toMap()
Mapu lze použít společně s funkcí Java collect(), aby se každému klíči přiřadila hodnota.
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);JavaVe výstupu vidíme, že každému sudému číslu ve vstupu byla přiřazena hodnota, která je s ním identická:
{2=2, 4=4, 6=6}JavaSpojte prvky v řetězci pomocí funkce joining()
Metoda joining() kombinuje prvky v proudu v pořadí, v jakém se objevují, a používá oddělovač k oddělení prvků. Oddělovač se předává jako argument do joining(). Pokud není zadán žádný oddělovač, joining() použije prázdný řetězec "".
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));JavaVýsledky jsou:
result1 ==> "abc"
result2 ==> "{a,b,c}"Java