Kako uporabljati Java collect() za zbiranje in obdelavo podatkov
Zbiralniki tokov so močna funkcionalnost v API-ju Java 8 Stream, ki omogoča učinkovito zbiranje in obdelavo podatkov. Tukaj bomo pojasnili njihovo strukturo in kako se lahko uporablja metoda Java collect().
Kako se lahko uporabi Java collect()?
Zbiralnik toka se lahko uporabi za ustvarjanje seznama, niza ali zemljevida iz toka. Tok je zaporedje elementov, ki se obdelujejo eden za drugim. Vmesnik zbiralnika zagotavlja niz operacij zmanjševanja za podatke v tokovnem vodilu. To so terminalne operacije, ki zbirajo in združujejo rezultate vmesnih korakov.
Zbiralniki se lahko uporabljajo za filtriranje ali razvrščanje objektov iz toka. Mogoče je tudi združevanje, na primer seštevanje številk, združevanje nizov ali štetje elementov. Poleg tega imajo zbiralniki funkcije, ki lahko pretvorijo vsebino toka v določeno strukturo. Seznam lahko na primer pretvorite v zemljevid. Skupine pomagajo kategorizirati elemente z določenimi lastnostmi ali pogoji. Najpomembnejša prednost zbiralnikov tokov je, da lahko obdelujejo podatke hkrati z več nitmi. To omogoča veliko hitrejše in učinkovitejše izvajanje operacij, zlasti pri velikih količinah podatkov.
Kakšna je sintaksa za Java collect()?
Metoda sprejme kot argument zbiralnik, ki opisuje, kako je treba zbrati in združiti elemente toka. Zbiralnik je vmesnik, ki ponuja različne metode za združevanje elementov toka v določeno obliko, na primer v seznam, niz ali zemljevid.
Obstajata dve različici metode Java Stream collect():
- R zbira(dobavitelj<R> dobavitelj, BiConsumer<R, ? super T> akumulator, BiConsumer<R, R> kombinator)
- <R, A> R zbiraj(Zbiralnik<? super T, A, R> zbiralnik)
Prva različica ima tri funkcije kot argumente:
- dobavitelj: ustvari posodo, ki se bo uporabljala za vmesne rezultate
- akumulator: izračuna končni rezultat
- kombinator: združi rezultate vzporednih operacij toka
Ti vnaprej določeni zbiralniki so že vključeni v standardno knjižnico in jih je mogoče enostavno uvoziti in uporabiti.
Druga različica sprejme zbiralnik kot argument in vrne rezultat.
- R: vrsta rezultata
- T: vrsta elementov v toku
- A: vrsta akumulatorja, ki shranjuje vmesno stanje delovanja zbiralnika
- kolektor: izvaja operacijo redukcije.
Z uporabo te variante lahko razvijalci ustvarijo prilagojene zbiralce, ki so posebej prilagojeni njihovim zahtevam in zagotavljajo večjo prožnost in nadzor nad procesom zmanjševanja.
Kakšni so praktični primeri uporabe Java collect()?
Spodaj prikazujemo različne funkcije metode Stream.collect(). Preden se lotite okvira zbirke, se morate seznaniti z osnovnimi operacijami Java.
Združi seznam nizov
Z Java Collect() lahko združimo seznam nizov, da dobimo nov niz:
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());JavaIzhod je:
abcde
a, b, c, d, eJavaV prvem izračunu je bila uporabljena samo ena instanca StringBuilder in ni bilo funkcije za združevanje. Zato je rezultat abcde.
V drugem izhodu je funkcija združevalnika združila instance StringBuilder in jih ločila z vejico.
Zberite elemente v seznamu s toList()
Z uporabo funkcije filter() lahko izberemo določene elemente seznama in jih nato s funkcijo toList() shranimo v nov seznam.
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);JavaNa novem seznamu so samo lihe številke:
[1, 3, 5, 7]JavaZberite elemente v nizu s toSet()
Podobno lahko izberemo elemente in iz njih ustvarimo novo množico. Elementi v množici niso nujno razvrščeni v določenem vrstnem redu.
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);JavaTo prikaže izhod:
[2, 4, 6]JavaZberite elemente v zemljevidu s toMap()
Zemljevid se lahko uporabi skupaj z Java collect(), da se vsakemu ključu dodeli vrednost.
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);JavaV izhodu lahko vidimo, da je vsaki sodej številki v vhodu dodeljena vrednost, ki je enaka tej številki:
{2=2, 4=4, 6=6}JavaZdružite elemente v niz z metodo joining()
Metoda joining() združuje elemente v toku v vrstnem redu, v katerem se pojavljajo, in uporablja ločilo za ločevanje elementov. Ločilo se prenese kot argument v joining(). Če ločilo ni določeno, joining() uporabi prazen niz "".
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));JavaRezultati so:
result1 ==> "abc"
result2 ==> "{a,b,c}"Java2031f050ecb6acd05c8d5a15242b684b
b0935f2d0a8a22847f34c718bc1097e2