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

1. R collect(Supplier&lt;R&gt; tiekėjas, BiConsumer&lt;R, ? super T&gt; kaupiklis, BiConsumer&lt;R, R&gt; jungiklis)
2. &lt;R, A&gt; R rinkti(Rinkėjas&lt;? super T, A, R&gt; 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ą:

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

Rezultatas yra:

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

Pirmajame 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.

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

Naujajame sąraše yra tik nelyginiai skaičiai:

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

### Surinkite 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**.

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

Tai rodo išvestį:

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

### Rinkite elementus žemėlapyje naudodami toMap()

Žemėlapį galima naudoti kartu su Java collect(), kad kiekvienam raktui būtų priskirta reikšmė.

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

Rezultate matome, kad kiekvienam įvesties poriniam skaičiui buvo priskirta jam identiška reikšmė:

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

### Sujunkite 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ę `""`.

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

Rezultatai yra tokie:

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


This is a markdown version of: [https://www.ionos.com/lt-lt/digitalguide/interneto-svetaines/interneto-svetainiu-kurimas/java-srauto-surinkimas/](https://www.ionos.com/lt-lt/digitalguide/interneto-svetaines/interneto-svetainiu-kurimas/java-srauto-surinkimas/) for AI/LLM consumption.