Stream je uveden u Java 8 Stream API koristi se za obradu kolekcija objekata. Tok u Javi je slijed objekata koji podržava različite metode koje se mogu usmjeriti u cjevovod kako bi se proizveo željeni rezultat.
Korištenje Streama u Javi
Upotreba Streama u Javi navedena je u nastavku:
- Stream API način je izražavanja i obrade kolekcija objekata.
- Omogućite nam izvođenje operacija poput filtriranja, mapiranja, smanjivanja i sortiranja.
Kako stvoriti Java Stream
Stvaranje Java Streama jedan je od najosnovnijih koraka prije razmatranja funkcionalnosti Java Streama. Ispod je data sintaksa za deklariranje Java Stream-a.
java sadrži podniz
Sintaksa
Stream
potok;
Ovdje je T ili objekt klase ili tip podataka, ovisno o deklaraciji.
Značajke Java toka
Značajke Java tokova navedene su u nastavku:
- Tok nije struktura podataka; samo uzima unos iz nizova zbirki ili I/O kanala.
- Streamovi ne mijenjaju izvorne podatke; oni samo svojim metodama daju rezultate.
- Intermedijarne operacije (poput mape filtra itd.) su lijene i vraćaju drugi tok tako da ih možete povezati u lance.
- Operacija terminala (kao što je collect forEach count) završava stream i daje konačni rezultat.
Različite operacije na tokovima
Postoje dvije vrste operacija u tokovima:
- Srednje operacije
- Operacije terminala
Srednje operacije

Međuoperacije su vrste operacija u kojima je više metoda ulančano u nizu.
Obilježja međuoperacija
- Metode su lančano povezane.
- Međuoperacije pretvaraju tok u drugi tok.
- Omogućuje koncept filtriranja gdje jedna metoda filtrira podatke i prosljeđuje ih drugoj metodi nakon obrade.
Važne međuoperacije
Dolje je spomenuto nekoliko posrednih operacija:
1. karta() : Metoda karte koristi se za vraćanje toka koji se sastoji od rezultata primjene zadane funkcije na elemente ovog toka.
Sintaksa:
Stream karta (funkcija super T ? extends R>maper)
2. filter() : Metoda filtra koristi se za odabir elemenata prema Predikatu proslijeđenom kao argument.
Sintaksa:
Stream
filter (predikat super T>predikat)
3. poredano() : sortirana metoda koristi se za sortiranje toka.
Sintaksa:
Stream
poredano()
Streamsortirano (Usporednik super T>usporednik)
4. flatMap(): Operacija flatMap u Java Streams koristi se za izravnavanje toka kolekcija u jedan tok elemenata.
Sintaksa:
Stream flatMap(funkcija super T ? extends Stream extends R>> maper)
5. različit() : Uklanja duplicirane elemente. Vraća tok koji se sastoji od različitih elemenata (prema Object.equals(Object)).
Sintaksa:
Stream
različit()
6. zaviriti() : Izvodi radnju na svakom elementu bez mijenjanja toka. Vraća tok koji se sastoji od elemenata ovog toka dodatno izvršavajući predviđenu radnju na svakom elementu kako se elementi troše iz rezultirajućeg toka.
Sintaksa:
Stream
zaviriti (Potrošač super T>akcijski)
Java program koji demonstrira korištenje svih međuoperacija:
Javaimport java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class StreamIntermediateOperationsExample { public static void main(String[] args) { // List of lists of names List<List<String>> listOfLists = Arrays.asList( Arrays.asList('Reflection' 'Collection' 'Stream') Arrays.asList('Structure' 'State' 'Flow') Arrays.asList('Sorting' 'Mapping' 'Reduction' 'Stream') ); // Create a set to hold intermediate results Set<String> intermediateResults = new HashSet<>(); // Stream pipeline demonstrating various intermediate operations List<String> result = listOfLists.stream() .flatMap(List::stream) .filter(s -> s.startsWith('S')) .map(String::toUpperCase) .distinct() .sorted() .peek(s -> intermediateResults.add(s)) .collect(Collectors.toList()); // Print the intermediate results System.out.println('Intermediate Results:'); intermediateResults.forEach(System.out::println); // Print the final result System.out.println('Final Result:'); result.forEach(System.out::println); } }
Izlaz
Intermediate Results: STRUCTURE STREAM STATE SORTING Final Result: SORTING STATE STREAM STRUCTURE
Obrazloženje:
- ListOfLists se stvara kao popis koji sadrži druge popise nizova.
- flatMap(List::stream): Spaja ugniježđene popise u jedan tok nizova.
- filter(s -> s.startsWith('S')) : Filtrira nizove tako da uključuje samo one koji počinju sa 'S'.
- karta(String::toUpperCase) : Pretvara svaki niz u toku u velika slova.
- različit() : Uklanja sve dvostruke nizove.
- poredano() : Razvrstava rezultirajuće nizove abecednim redom.
- zaviriti(...): Dodaje svaki obrađeni element skupu intermediateResults za međuinspekciju.
- prikupi(Collectors.toList()): Prikuplja konačne obrađene nizove u popis koji se zove rezultat.
Program ispisuje međurezultate pohranjene u skupu intermediateResults. Na kraju ispisuje popis rezultata koji sadrži potpuno obrađene nizove nakon svih operacija toka.
Operacije terminala
Operacije terminala su vrste operacija koje vraćaju rezultat. Ove se operacije ne obrađuju dalje, samo vraćaju konačnu vrijednost rezultata.
concat nizovi java
Važne operacije terminala
1. prikupiti() : Metoda collect koristi se za vraćanje rezultata posrednih operacija izvedenih na toku.
Sintaksa:
R collect(Sakupljač super T A R>kolektor)
2. forEach() : Metoda forEach koristi se za ponavljanje kroz svaki element toka.
Sintaksa:
void forEach(Potrošač super T>akcijski)
3. smanjiti(): Metoda reduciranja koristi se za reduciranje elemenata toka na jednu vrijednost. Metoda redukcije uzima BinarniOperator kao parametar.
Sintaksa:
T smanji(T identitet BinarniOperator
akumulator)
Neobaveznosmanjiti(BinarniOperator akumulator)
4. broji() : Vraća broj elemenata u toku.
Sintaksa:
dugo brojanje()
5. findFirst() : Vraća prvi element toka ako postoji.
Sintaksa:
Neobavezno
FindFirst() avl rotacija stabla
6. allMatch() : Provjerava odgovaraju li svi elementi toka danom predikatu.
Sintaksa:
boolean allMatch(predikat super T>predikat)
7. Bilo koje podudaranje () : Provjerava odgovara li neki element toka danom predikatu.
Sintaksa:
Booleovo bilo koje podudaranje (predikat super T>predikat)
Ovdje se varijabli ans dodjeljuje 0 kao početna vrijednost i dodaje joj se i.
Bilješka: Intermediate Operations izvode se na temelju koncepta Lazy Evaluation koji osigurava da svaka metoda vraća fiksnu vrijednost (operacija terminala) prije prelaska na sljedeću metodu.
Java program koji koristi sve operacije terminala:
Javaimport java.util.*; import java.util.stream.Collectors; public class StreamTerminalOperationsExample { public static void main(String[] args) { // Sample data List<String> names = Arrays.asList( 'Reflection' 'Collection' 'Stream' 'Structure' 'Sorting' 'State' ); // forEach: Print each name System.out.println('forEach:'); names.stream().forEach(System.out::println); // collect: Collect names starting with 'S' into a list List<String> sNames = names.stream() .filter(name -> name.startsWith('S')) .collect(Collectors.toList()); System.out.println('ncollect (names starting with 'S'):'); sNames.forEach(System.out::println); // reduce: Concatenate all names into a single string String concatenatedNames = names.stream().reduce( '' (partialString element) -> partialString + ' ' + element ); System.out.println('nreduce (concatenated names):'); System.out.println(concatenatedNames.trim()); // count: Count the number of names long count = names.stream().count(); System.out.println('ncount:'); System.out.println(count); // findFirst: Find the first name Optional<String> firstName = names.stream().findFirst(); System.out.println('nfindFirst:'); firstName.ifPresent(System.out::println); // allMatch: Check if all names start with 'S' boolean allStartWithS = names.stream().allMatch( name -> name.startsWith('S') ); System.out.println('nallMatch (all start with 'S'):'); System.out.println(allStartWithS); // anyMatch: Check if any name starts with 'S' boolean anyStartWithS = names.stream().anyMatch( name -> name.startsWith('S') ); System.out.println('nanyMatch (any start with 'S'):'); System.out.println(anyStartWithS); } }
Izlaz:
IzlazObrazloženje:
- Popis imena kreiran je s oglednim nizovima.
- zaSvakog: Ispisuje svako ime na popisu.
- prikupiti : Filtrira imena koja počinju sa 'S' i prikuplja ih u novi popis.
- smanjiti : Spaja sva imena u jedan niz.
- računati : Broji ukupan broj imena.
- findFirst : Pronalazi i ispisuje prvo ime na popisu.
- allMatch : Provjerava počinju li sva imena sa 'S'.
- nesretan : Provjerava da li neko ime počinje sa 'S'.
Program ispisuje svako ime imena koja počinju sa 'S' spojena imena broj imena prvo ime da li sva imena počinju sa 'S' i da li neko ime počinje sa 'S'.
Prednosti Java Streama
Postoje neke prednosti zbog kojih koristimo Stream u Javi kao što je navedeno u nastavku:
- Nema pohrane
- Cjevovod funkcija
- Lijenost
- Može biti beskonačno
- Može se paralelizirati
- Može se stvoriti iz nizova kolekcija Datoteke Linije Metode u Stream IntStream itd.
Slučajevi korištenja Java tokova iz stvarnog svijeta
Streamovi se široko koriste u modernim Java aplikacijama za:
- Obrada podataka
- Za obradu JSON/XML odgovora
- Za operacije baze podataka
- Istodobna obrada