Java collect() -komennon käyttö tietojen keräämiseen ja käsittelyyn
Stream Collectors on Java 8 Stream API: n tehokas ominaisuus, jonka avulla voit kerätä ja käsitellä dataa tehokkaasti. Tässä selitämme niiden rakenteen ja miten Java collect() -metodia voidaan käyttää.
Miten Java collect()-funktiota voidaan käyttää?
Stream Collector -työkalua voidaan käyttää luomaan luettelo, joukko tai kartta streamista. Stream on peräkkäin käsiteltävien elementtien sarja. Collector-rajapinta tarjoaa joukon reduktioprosesseja stream-putken dataa varten. Nämä ovat päätetoimintoja, jotka keräävät ja yhdistävät välivaiheiden tulokset.
Kerääjiä voidaan käyttää suodattamaan tai lajittelemaan objektit virrasta. Myös aggregointi on mahdollista, kuten numeroiden summaaminen, merkkijonojen yhdistäminen tai elementtien laskeminen. Lisäksi kerääjillä on toimintoja, joilla virran sisältö voidaan muuntaa tiettyyn rakenteeseen. Voit esimerkiksi muuntaa luettelon kartaksi. Ryhmittelyt auttavat luokittelemaan elementit tiettyjen ominaisuuksien tai ehtojen perusteella. Tärkeintä on, että Stream Collectors -kerääjillä on se etu, että ne voivat käsitellä dataa samanaikaisesti useilla säikeillä. Tämä mahdollistaa toimintojen suorittamisen paljon nopeammin ja tehokkaammin, erityisesti suurten datamäärien kanssa.
Mikä on Java collect()-komennon syntaksi?
Menetelmä hyväksyy argumenttina Collectorin, joka kuvaa, miten streamin elementit tulisi kerätä ja aggregoida. Collector on rajapinta, joka tarjoaa erilaisia menetelmiä stream-elementtien aggregoimiseksi tiettyyn muotoon, esimerkiksi luetteloksi, joukkoksi tai kartaksi.
Java Stream -metodissa collect() on kaksi varianttia:
- R collect(Supplier<R> toimittaja, BiConsumer<R, ? super T> akkumulaattori, BiConsumer<R, R> yhdistelijä)
- <R, A> R collect(Collector<? super T, A, R> collector)
Ensimmäisessä variantissa on kolme funktiota argumentteina:
- toimittaja: luo välituloksia varten käytettävän säilytyspaikan
- accumulator: laskee lopullisen tuloksen
- yhdistelmälaite: yhdistää rinnakkaisten virtaoperaatioiden tulokset
Nämä ennalta määritellyt kerääjät sisältyvät jo vakiokirjastoon, ja ne on helppo tuoda ja käyttää.
Toinen variantti hyväksyy Collectorin argumenttina ja palauttaa tuloksen.
- R: tuloksen tyyppi
- T: virran elementtien tyyppi
- A: kerääjän toiminnan välivaiheen tilan tallentavan akkumulaattorin tyyppi
- kerääjä: suorittaa pelkistysoperaation.
Tätä vaihtoehtoa käyttämällä kehittäjät voivat luoda räätälöityjä kerääjiä, jotka on erityisesti sovitettu heidän vaatimuksiinsa ja jotka tarjoavat suuremman joustavuuden ja hallinnan vähentämisprosessissa.
Mitä ovat käytännön esimerkkejä Java collect()-funktion käytöstä?
Alla kuvataan Stream.collect() -menetelmän erilaisia toimintoja. Sinun tulisi olla jo perehtynyt Java-operaattoreiden perusteisiin ennen kuin siirryt kokoelmakehykseen.
Yhdistä merkkijonojen luettelo
Java Collect() -toiminnolla voimme yhdistää merkkijonojen luettelon saadaksemme uuden merkkijonon:
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());JavaTulostus on:
abcde
a, b, c, d, eJavaEnsimmäisessä laskelmassa käytettiin vain yhtä StringBuilder-ilmentymää eikä yhdistämistoimintoa. Siksi tulos on abcde.
Toisessa tuloksessa yhdistämistoiminto yhdisti StringBuilder-ilmentymät ja erotti ne toisistaan pilkulla.
Kerää elementit luetteloon toList()-funktiolla
Voimme käyttää filter() valitaksemme tietyt elementit listasta ja sitten käyttää toList() tallentaaksemme ne uuteen listaan.
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);JavaUudessa luettelossa on vain parittomia lukuja:
[1, 3, 5, 7]JavaKerää elementit joukkoon toSet()-funktiolla
Vastaavasti voimme valita elementtejä ja luoda niistä uuden joukon. Joukon elementtien ei tarvitse olla järjestettyinä tiettyyn järjestykseen.
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);JavaTämä näyttää tuloksen:
[2, 4, 6]JavaKerää elementit karttaan toMap()-funktiolla
Karttaa voidaan käyttää yhdessä Java collect() -komennon kanssa arvon määrittämiseksi kullekin avaimelle.
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);JavaTuloksessa voimme nähdä, että jokaiselle syötteen parilliselle luvulle on annettu sama arvo kuin sille:
{2=2, 4=4, 6=6}JavaYhdistä merkkijonon elementit joining()-funktiolla
joining() yhdistää elementit virrassa niiden esiintymisjärjestyksessä ja käyttää erottinta elementtien erottamiseen. Erottin välitetään argumenttina joining()lle. Jos erottinta ei ole määritetty, joining() käyttää tyhjää merkkijonoa "".
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));JavaTulokset ovat:
result1 ==> "abc"
result2 ==> "{a,b,c}"Java4badd840839b54cea0232685028c6727