# 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:

1. R collect(Supplier&lt;R&gt; toimittaja, BiConsumer&lt;R, ? super T&gt; akkumulaattori, BiConsumer&lt;R, R&gt; yhdistelijä)
2. &lt;R, A&gt; R collect(Collector&lt;? super T, A, R&gt; 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:

```Java
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());
```

Tulostus on:

```Java
abcde
a, b, c, d, e
```

Ensimmä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.

```Java
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);
```

Uudessa luettelossa on vain parittomia lukuja:

```Java
[1, 3, 5, 7]
```

### Kerää elementit joukkoon toSet()-funktiolla

Vastaavasti voimme valita elementtejä ja luoda niistä uuden joukon. Joukon elementtien **ei tarvitse olla järjestettyinä tiettyyn järjestykseen.**

```Java
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);
```

Tämä näyttää tuloksen:

```Java
[2, 4, 6]
```

### Kerää elementit karttaan toMap()-funktiolla

Karttaa voidaan käyttää yhdessä Java collect() -komennon kanssa arvon määrittämiseksi kullekin avaimelle.

```Java
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);
```

Tuloksessa voimme nähdä, että jokaiselle syötteen parilliselle luvulle on annettu sama arvo kuin sille:

```Java
{2=2, 4=4, 6=6}
```

### Yhdistä 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 `""`.

```Java
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));
```

Tulokset ovat:

```Java
result1 ==> "abc"
result2 ==> "{a,b,c}"
```


This is a markdown version of: [https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-stream-collect/](https://www.ionos.com/fi-fi/digitalguide/verkkosivustot/verkkosivujen-kehittaeminen/java-stream-collect/) for AI/LLM consumption.