Kaip naudoti Java collect() duomenims rinkti ir apdoroti
Srauto surinkėjai yra galinga Java 8 srauto API funkcija, leidžianti efektyviai rinkti ir apdoroti duomenis. Čia paaiškinsime jų struktūrą ir kaip galima naudoti Java collect() metodą.
Kaip galima naudoti Java collect()?
Srauto kolektorius gali būti naudojamas sąrašui, rinkiniui ar žemėlapiui iš srauto sukurti. Srautas yra elementų seka, kurie apdorojami vienas po kito. Kolektoriaus sąsaja teikia srauto vamzdyne esančių duomenų redukcijos operacijų rinkinį. Tai yra galutinės operacijos, kurios renka ir sujungia tarpinio etapo rezultatus.
Kolektoriai gali būti naudojami objektams iš srauto filtruoti ar rūšiuoti. Taip pat galima atlikti agregaciją, pavyzdžiui, sudėti skaičius, sujungti eilutes ar suskaičiuoti elementus. Be to, kolektoriai turi funkcijas, kurios gali transformuoti srauto turinį į tam tikrą struktūrą. Pavyzdžiui, galite transformuoti sąrašą į žemėlapį. Grupavimas padeda kategorizuoti elementus pagal tam tikras savybes ar sąlygas. Svarbiausia, srauto kolektoriai turi pranašumą, kad jie gali apdoroti duomenis tuo pačiu metu naudodami kelis sriegius. Tai leidžia operacijas atlikti daug greičiau ir efektyviau, ypač kai duomenų kiekis yra didelis.
Kokia yra Java collect() sintaksė?
Šis metodas kaip argumentą priima kolektorių, kuris apibūdina, kaip srauto elementai turėtų būti renkami ir agreguojami. Kolektorius yra sąsaja, kuri teikia įvairius metodus srauto elementams agreguoti į tam tikrą formą, pavyzdžiui, į sąrašą, rinkinį ar žemėlapį.
Yra du Java Stream collect() metodo variantai:
- R collect(Supplier<R> tiekėjas, BiConsumer<R, ? super T> kaupiklis, BiConsumer<R, R> jungiklis)
- <R, A> R rinkti(Rinkėjas<? super T, A, R> rinkėjas)
Pirmasis variantas turi tris funkcijas kaip argumentus:
- tiekėjas: sukuria konteinerį, kuris bus naudojamas tarpiniams rezultatams
- akumuliatorius: apskaičiuoja galutinį rezultatą
- kombinatorius: sujungia lygiagrečių srautų operacijų rezultatus
Šie iš anksto apibrėžti kolektoriai jau yra įtraukti į standartinę biblioteką ir juos galima lengvai importuoti bei naudoti.
Antrasis variantas priima kolektorių kaip argumentą ir grąžina rezultatą.
- R: rezultato tipas
- T: srauto elementų tipas
- A: akumuliatoriaus, kuriame saugoma tarpinė kolektoriaus operacijos būsena, tipas
- kolektorius: vykdo redukcijos operaciją.
Naudodami šį variantą, kūrėjai gali kurti individualizuotus kolektorius, kurie yra specialiai pritaikyti jų reikalavimams ir suteikia didesnį lankstumą bei kontrolę mažinimo procese.
Kokie yra praktiniai Java collect() naudojimo pavyzdžiai?
Toliau pateikiame Stream.collect() metodo įvairias funkcijas. Prieš pradėdami dirbti su kolekcijų struktūra, turėtumėte būti susipažinę su pagrindiniais Java operatoriais.
Sujungti stygų sąrašą
Naudodami Java Collect(), galime sujungti stygų sąrašą, kad gautume naują stygą:
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());JavaRezultatas yra:
abcde
a, b, c, d, eJavaPirmajame skaičiavime buvo naudojamas tik vienas StringBuilder egzempliorius ir nebuvo jokios jungimo funkcijos. Todėl rezultatas yra abcde.
Antrajame išvesties rezultate sujungimo funkcija sujungė StringBuilder egzempliorius ir atskyrė juos kableliu.
Surinkite elementus į sąrašą naudodami toList()
Mes galime naudoti filter() funkciją, kad atrinktume tam tikrus sąrašo elementus, o tada naudoti toList(), kad juos išsaugotume naujame sąraše.
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);JavaNaujajame sąraše yra tik nelyginiai skaičiai:
[1, 3, 5, 7]JavaSurinkite elementus į rinkinį naudodami toSet()
Panašiai, mes galime pasirinkti elementus ir iš jų sukurti naują rinkinį. Rinkinio elementai neturi būti išdėstyti tam tikra tvarka.
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);JavaTai rodo išvestį:
[2, 4, 6]JavaRinkite elementus žemėlapyje naudodami toMap()
Žemėlapį galima naudoti kartu su Java collect(), kad kiekvienam raktui būtų priskirta reikšmė.
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);JavaRezultate matome, kad kiekvienam įvesties poriniam skaičiui buvo priskirta jam identiška reikšmė:
{2=2, 4=4, 6=6}JavaSujunkite elementus į eilutę naudodami jungimo funkciją ()
joining() metodas sujungia elementus sraute ta tvarka, kuria jie pasirodo, ir naudoja atskyriklį elementams atskirti. Atskyriklis perduodamas kaip argumentas joining(). Jei atskyriklis nenurodytas, joining() naudoja tuščią eilutę "".
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));JavaRezultatai yra tokie:
result1 ==> "abc"
result2 ==> "{a,b,c}"Java2031f050ecb6acd05c8d5a15242b684b
0cacb08f2ba4d3f69e4e6722d466a801