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

1. R zbira(dobavitelj&lt;R&gt; dobavitelj, BiConsumer&lt;R, ? super T&gt; akumulator, BiConsumer&lt;R, R&gt; kombinator)
2. &lt;R, A&gt; R zbiraj(Zbiralnik&lt;? super T, A, R&gt; 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:

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

Izhod je:

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

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

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

Na novem seznamu so samo lihe številke:

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

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

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

To prikaže izhod:

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

### Zberite elemente v zemljevidu s toMap()

Zemljevid se lahko uporabi skupaj z Java collect(), da se vsakemu ključu dodeli vrednost.

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

V izhodu lahko vidimo, da je vsaki sodej številki v vhodu dodeljena vrednost, ki je enaka tej številki:

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

### Združ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 `""`.

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

Rezultati so:

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


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/java-stream-collect/](https://www.ionos.com/sl-si/digitalguide/spletne-strani/razvoj-spletnih-strani/java-stream-collect/) for AI/LLM consumption.