logo

Stream u Javi

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

Streampotok;

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:

  1. Srednje operacije
  2. Operacije terminala

Srednje operacije

Java Stream Operacije' title=

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:

Streamkarta (funkcijamaper)

2. filter() : Metoda filtra koristi se za odabir elemenata prema Predikatu proslijeđenom kao argument.

Sintaksa:

Streamfilter (predikatpredikat)

3. poredano() : sortirana metoda koristi se za sortiranje toka.

Sintaksa:

Streamporedano()
Streamsortirano (Usporednikusporednik)

4. flatMap(): Operacija flatMap u Java Streams koristi se za izravnavanje toka kolekcija u jedan tok elemenata.

Sintaksa:

StreamflatMap(funkcija> maper)

5. različit() : Uklanja duplicirane elemente. Vraća tok koji se sastoji od različitih elemenata (prema Object.equals(Object)).

Sintaksa:

Streamrazlič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:

Streamzaviriti (Potrošačakcijski)

Java program koji demonstrira korištenje svih međuoperacija:

Java
import 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čkolektor)

2. forEach() : Metoda forEach koristi se za ponavljanje kroz svaki element toka.

Sintaksa:

void forEach(Potrošač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 BinarniOperatorakumulator)
Neobaveznosmanjiti(BinarniOperatorakumulator)

4. broji() : Vraća broj elemenata u toku.

Sintaksa:

dugo brojanje()

5. findFirst() : Vraća prvi element toka ako postoji.

Sintaksa:

NeobaveznoFindFirst()

avl rotacija stabla

6. allMatch() : Provjerava odgovaraju li svi elementi toka danom predikatu.

Sintaksa:

boolean allMatch(predikatpredikat)

7. Bilo koje podudaranje () : Provjerava odgovara li neki element toka danom predikatu.

Sintaksa:

Booleovo bilo koje podudaranje (predikatpredikat)

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:

Java
import 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:

StreamsOutput' loading='lazy' title=Izlaz

Obrazlož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