Stream v Jave

Stream v Jave

Stream bol predstavený v r Java 8 Stream API sa používa na spracovanie kolekcií objektov. Prúd v jazyku Java je sekvencia objektov, ktoré podporujú rôzne metódy, ktoré možno zreťaziť na dosiahnutie požadovaného výsledku. 

Použitie streamu v jazyku Java

Využitie Streamu v Jave je uvedené nižšie:

  • Stream API je spôsob vyjadrenia a spracovania kolekcií objektov.
  • Umožnite nám vykonávať operácie, ako je filtrovanie, zmenšenie mapovania a triedenie.

Ako vytvoriť Java stream

Vytvorenie Java Streamu je jedným z najzákladnejších krokov pred zvážením funkcií Java Streamu. Nižšie je uvedená syntax na deklarovanie Java Stream.

Syntax

Stream prúd;

Tu je T buď objekt triedy alebo dátový typ v závislosti od deklarácie.

Funkcie Java Stream

Funkcie Java streamov sú uvedené nižšie:

  • Stream nie je dátová štruktúra; berie len vstup z kolekcií alebo I/O kanálov.
  • Prúdy nemenia pôvodné údaje; výsledky dosahujú len pomocou svojich metód.
  • Prechodné operácie (napríklad filtračná mapa atď.) sú lenivé a vracajú ďalší stream, takže ich môžete spojiť.
  • Operácia terminálu (napríklad zhromažďovanie pre každý počet) ukončí stream a poskytne konečný výsledok.

Rôzne operácie na streamoch

V streamoch existujú dva typy operácií:

  1. Medziľahlé operácie
  2. Terminálové operácie

Medziľahlé operácie

Operácie Java Stream

Medziľahlé operácie sú typy operácií, v ktorých sú viaceré metódy zreťazené za sebou.

Charakteristika medzioperačných operácií

  • Metódy sú spojené.
  • Medziľahlé operácie transformujú prúd na iný prúd.
  • Umožňuje koncepciu filtrovania, kde jedna metóda filtruje dáta a po spracovaní ich odovzdáva inej metóde.

Dôležité prechodné operácie

Nižšie je uvedených niekoľko prechodných operácií:

1. mapa() : Metóda mapy sa používa na vrátenie prúdu pozostávajúceho z výsledkov aplikácie danej funkcie na prvky tohto prúdu.

Syntax:

Stream mapa (Funkcia mapovač)

2. filter() : Metóda filtra sa používa na výber prvkov podľa predikátu odovzdaného ako argument.

Syntax:

Stream filter (predikát predikát)

3. zoradené() : Metóda zoradené sa používa na triedenie prúdu.

Syntax:

Stream zoradené ()
Stream zoradené (porovnávač porovnávač)

4. plochá mapa(): Operácia flatMap v Java Streams sa používa na zlúčenie prúdu kolekcií do jedného prúdu prvkov.

Syntax:

Stream plochá mapa (Funkcia > mapovač)

5. odlišný() : Odstráni duplicitné prvky. Vracia tok pozostávajúci z odlišných prvkov (podľa Object.equals(Object)).

Syntax:

Stream odlišný ()

6. nahliadnuť () : Vykoná akciu na každom prvku bez úpravy streamu. Vracia tok pozostávajúci z prvkov tohto toku, ktorý dodatočne vykonáva poskytnutú akciu na každom prvku, pretože prvky sú spotrebované z výsledného toku.

Syntax:

Stream nahliadnuť (Spotrebiteľ akcia)

Java program, ktorý demonštruje použitie všetkých medzioperačných operácií:

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

Výstup
Intermediate Results: STRUCTURE STREAM STATE SORTING Final Result: SORTING STATE STREAM STRUCTURE  

Vysvetlenie:

  • ListOfLists je vytvorený ako zoznam obsahujúci ďalšie zoznamy reťazcov.
  • plochá mapa(Zoznam::stream): Zlúči vnorené zoznamy do jedného prúdu reťazcov.
  • filter(s -> s.startsWith('S')) : Filtruje reťazce tak, aby obsahovali iba tie, ktoré začínajú na „S“.
  • map(String::toUpperCase) : Prevedie každý reťazec v streame na veľké písmená.
  • odlišný () : Odstráni všetky duplicitné reťazce.
  • zoradené () : Zoradí výsledné reťazce podľa abecedy.
  • nahliadnuť (...): Pridá každý spracovaný prvok do sady medziľahlých výsledkov pre priebežnú kontrolu.
  • collect(Collectors.toList()): Zhromažďuje konečné spracované reťazce do zoznamu nazývaného výsledok.

Program vytlačí medzivýsledky uložené v sade medzivýsledkov. Nakoniec vytlačí zoznam výsledkov, ktorý obsahuje plne spracované reťazce po všetkých streamovacích operáciách.

Terminálové operácie

Terminálové operácie sú typom operácií, ktoré vracajú výsledok. Tieto operácie sa ďalej nespracúvajú, len vrátia konečnú výslednú hodnotu.

Dôležité terminálové operácie

1. zbierať () : Metóda zhromažďovania sa používa na vrátenie výsledku medzioperácií vykonaných na toku.

Syntax:

R zbierať (zberateľ zberateľ)

2. forEach() : Metóda forEach sa používa na iteráciu cez každý prvok prúdu.

Syntax:

neplatné pre každého (spotrebiteľa akcia)

3. znížiť(): Metóda redukcie sa používa na redukciu prvkov toku na jednu hodnotu. Metóda redukcie berie ako parameter BinaryOperator.

Syntax:

T redukovať (T identity BinaryOperator akumulátor)
Voliteľné znížiť (BinaryOperator akumulátor)

4. počet() : Vráti počet prvkov v prúde.

Syntax:

dlhý počet ()

5. findFirst() : Vráti prvý prvok prúdu, ak je prítomný.

Syntax:

Voliteľné findFirst()

6. allMatch() : Kontroluje, či sa všetky prvky prúdu zhodujú s daným predikátom.

Syntax:

boolean allMatch(Predicate predikát)

7. Anymatch () : Kontroluje, či sa niektorý prvok prúdu zhoduje s daným predikátom.

Syntax:

Boolean Anymatch (predikát predikát)

Tu sa premennej ans priradí 0 ako počiatočná hodnota a pripočíta sa k nej i.

Poznámka: Priebežné operácie sú spustené na základe konceptu Lazy Evaluation, ktorý zabezpečuje, že každá metóda vráti pevnú hodnotu (terminálna operácia) pred prechodom na ďalšiu metódu.

Program Java využívajúci všetky operácie terminálu:

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

výstup:

StreamsOutputVýstup

Vysvetlenie:

  • Zoznam mien je vytvorený pomocou vzorových reťazcov.
  • pre každého: Vytlačí každé meno v zozname.
  • zbierať : Filtruje názvy začínajúce na „S“ a zhromažďuje ich do nového zoznamu.
  • znížiť : Spojí všetky mená do jedného reťazca.
  • počítať : Spočíta celkový počet mien.
  • findFirst : Vyhľadá a vytlačí krstné meno v zozname.
  • allMatch : Skontroluje, či všetky mená začínajú na „S“.
  • smolu : Kontroluje, či nejaké meno začína na „S“.

Program vypíše mená každého mena začínajúce na 'S' zreťazené mená počet mien krstné meno, či všetky mená začínajú na 'S' a či nejaké meno začína na 'S'.

Výhoda Java Stream

Existuje niekoľko výhod, kvôli ktorým používame Stream v jazyku Java, ako je uvedené nižšie:

  • Žiadne úložisko
  • Pipeline of Functions
  • Lenivosť
  • Môže byť nekonečný
  • Dá sa paralelizovať
  • Možno vytvoriť z polí kolekcií Súbory Riadky Metódy v Stream IntStream atď.

Prípady použitia streamov Java v reálnom svete

Streamy sú široko používané v moderných Java aplikáciách pre:

  • Spracovanie údajov
  • Na spracovanie odpovedí JSON/XML
  • Pre databázové operácie
  • Súbežné spracovanie