Stream u Javi

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.

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:

  1. Srednje operacije
  2. Operacije terminala

Srednje operacije

Java Stream 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 maper)

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

Sintaksa:

Stream filter (predikat predikat)

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

Sintaksa:

Stream poredano()
Stream sortirano (Usporednik usporednik)

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

Sintaksa:

Stream flatMap(funkcija > 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č 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.

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 BinarniOperator akumulator)
Neobavezno smanjiti(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()

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

Sintaksa:

boolean allMatch(predikat predikat)

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

Sintaksa:

Booleovo bilo koje podudaranje (predikat 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:

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:

StreamsOutputIzlaz

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