logo

Stream v Javě

Stream byl zaveden v r Java 8 Stream API se používá ke zpracování kolekcí objektů. Proud v Javě je posloupnost objektů, které podporují různé metody, které mohou být zřetězeny k dosažení požadovaného výsledku. 

Použití Stream v Javě

Použití Streamu v Javě je uvedeno níže:



  • Stream API je způsob, jak vyjádřit a zpracovat kolekce objektů.
  • Umožněte nám provádět operace, jako je filtrování, redukce mapování a řazení.

Jak vytvořit Java Stream

Vytvoření Java Stream je jedním z nejzákladnějších kroků před zvažováním funkcí Java Stream. Níže je uvedena syntaxe pro deklaraci Java Stream.

harald baldr

Syntax

Proudproud;

Zde T je buď objekt třídy nebo datový typ v závislosti na deklaraci.



Funkce Java Stream

Vlastnosti Java streamů jsou uvedeny níže:

  • Stream není datová struktura; pouze přebírá vstup z polí kolekcí nebo I/O kanálů.
  • Proudy nemění původní data; výsledky dosahují pouze pomocí svých metod.
  • Mezilehlé operace (jako je mapa filtru atd.) jsou líné a vracejí jiný Stream, takže je můžete spojit dohromady.
  • Terminálová operace (jako collect forEach count) ukončí stream a poskytne konečný výsledek.

Různé operace na proudech

Ve streamech existují dva typy operací:

  1. Mezilehlé operace
  2. Terminálové operace

Mezilehlé operace

Operace Java Stream' title=



Mezilehlé operace jsou typy operací, ve kterých je několik metod zřetězeno za sebou.

Charakteristika mezioperačních operací

  • Metody jsou spojeny dohromady.
  • Mezilehlé operace transformují proud na jiný proud.
  • Umožňuje koncept filtrování, kdy jedna metoda filtruje data a po zpracování je předává jiné metodě.

Důležité přechodné operace

Níže je uvedeno několik přechodných operací:

1. mapa() : Metoda map slouží k vrácení proudu sestávajícího z výsledků aplikace dané funkce na prvky tohoto proudu.

Syntax:

Proudmapa (Funkcemapovač)

2. filtr() : Metoda filtru se používá k výběru prvků podle predikátu předaného jako argument.

Syntax:

Proudfiltr (predikátpredikát)

3. seřazeno() : Metoda třídění se používá k řazení proudu.

Syntax:

Proudseřazeno()
Proudseřazeno (Porovnávačsrovnávač)

4. plochá mapa(): Operace flatMap v Java Streams se používá ke sloučení proudu kolekcí do jediného proudu prvků.

Syntax:

Proudplochá mapa (Funkce> mapovač)

5. odlišný() : Odstraní duplicitní prvky. Vrací proud sestávající z odlišných prvků (podle Object.equals(Object)).

Syntax:

Proudodlišný()

6. nahlédnout() : Provede akci s každým prvkem bez úpravy proudu. Vrací tok sestávající z prvků tohoto toku, který navíc provádí poskytnutou akci na každém prvku, protože prvky jsou spotřebovány z výsledného toku.

Syntax:

Proudnahlédnout (Spotřebitelakce)

Java program, který demonstruje použití všech mezioperačních operací:

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 

Vysvětlení:

  • ListOfLists je vytvořen jako seznam obsahující další seznamy řetězců.
  • plochá mapa(Seznam::stream): Sloučí vnořené seznamy do jednoho proudu řetězců.
  • filtr(s -> s.startsWith('S')) : Filtruje řetězce tak, aby zahrnovaly pouze ty, které začínají na „S“.
  • map(String::toUpperCase) : Převede každý řetězec v proudu na velká písmena.
  • odlišný() : Odstraní všechny duplicitní řetězce.
  • seřazeno() : Seřadí výsledné řetězce abecedně.
  • nahlédnout (...): Přidá každý zpracovaný prvek do sady mezilehlých výsledků pro průběžnou kontrolu.
  • collect(Collectors.toList()): Shromažďuje konečné zpracované řetězce do seznamu s názvem result.

Program vytiskne mezivýsledky uložené v sadě mezivýsledků. Nakonec vytiskne seznam výsledků, který obsahuje plně zpracované řetězce po všech operacích streamu.

Terminálové operace

Terminálové operace jsou typem operací, které vracejí výsledek. Tyto operace nejsou dále zpracovávány, pouze vrací konečnou výslednou hodnotu.

Důležité operace terminálu

1. sbírat() : Metoda shromažďování se používá k vrácení výsledku mezioperačních operací provedených na datovém proudu.

Syntax:

R sbírat (Sběratelkolektor)

2. forEach() : Metoda forEach se používá k iteraci každého prvku proudu.

Syntax:

neplatné pro každého (spotřebiteleakce)

3. snížit(): Metoda redukce se používá k redukci prvků proudu na jednu hodnotu. Metoda snížení bere jako parametr BinaryOperator.

Syntax:

k-nn algoritmus

T redukovat (T identity BinaryOperatorakumulátor)
Volitelnýsnížit (BinaryOperatorakumulátor)

4. počítat() : Vrátí počet prvků v proudu.

Syntax:

dlouhý počet ()

5. findFirst() : Vrátí první prvek proudu, pokud je přítomen.

Syntax:

VolitelnýfindFirst()

pokud jinak v Javě

6. allMatch() : Kontroluje, zda všechny prvky proudu odpovídají danému predikátu.

Syntax:

boolean allMatch(Predicatepredikát)

7. Anymatch () : Kontroluje, zda některý prvek proudu odpovídá danému predikátu.

Syntax:

Boolean Anymatch (predikátpredikát)

Zde je proměnné ans přiřazena 0 jako počáteční hodnota a je k ní přidáno i.

Poznámka: Mezilehlé operace běží na základě konceptu líného hodnocení, který zajišťuje, že každá metoda vrátí pevnou hodnotu (terminální operace) před přechodem na další metodu.

Program Java využívající všechny operace 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:

StreamsOutput' loading='lazy' title=Výstup

Vysvětlení:

  • Seznam jmen je vytvořen pomocí vzorových řetězců.
  • pro každého: Vytiskne každé jméno v seznamu.
  • sbírat : Filtruje názvy začínající na „S“ a shromažďuje je do nového seznamu.
  • snížit : Zřetězí všechna jména do jednoho řetězce.
  • počítat : Spočítá celkový počet jmen.
  • findFirst : Vyhledá a vytiskne křestní jméno v seznamu.
  • allMatch : Zkontroluje, zda všechna jména začínají na 'S'.
  • nešťastný : Kontroluje, zda nějaké jméno začíná na 'S'.

Program vypíše každé jméno jména začínající na 'S' zřetězená jména počet jmen křestní jméno, zda všechna jména začínají na 'S' a zda nějaké jméno začíná na 'S'.

Výhoda Java Stream

Existují některé výhody, kvůli kterým používáme Stream v Javě, jak je uvedeno níže:

  • Žádné úložiště
  • Pipeline of Functions
  • Lenost
  • Může být nekonečný
  • Lze paralelizovat
  • Lze vytvořit z polí kolekcí Soubory Řádky Metody v Stream IntStream atd.

Případy použití Java streamů v reálném světě

Streamy jsou široce používány v moderních Java aplikacích pro:

  • Zpracování dat
  • Pro zpracování odpovědí JSON/XML
  • Pro databázové operace
  • Souběžné zpracování