Moderni reseni

Přestávka na kávu #177. Komplexní průvodce streamováním v Javě 8

Můžeme vytvořit prázdný proud pro pozdější použití v našem kódu. Použití metody Stream.empty() vygeneruje prázdný proud, který neobsahuje žádné hodnoty. Tento prázdný proud může být užitečný, pokud chceme během provádění přeskočit výjimku nulového ukazatele. K tomu můžeme použít následující příkaz:

Stream str = Stream.empty(); 

Výše uvedený příkaz vygeneruje prázdný proud s názvem str bez jakýchkoli prvků uvnitř. Pro ověření stačí zkontrolovat počet nebo velikost proudu pomocí termínu str.count(). Například

System.out.println(str.count()); 

Výsledkem je, že na výstupu dostaneme 0.

2. Vytvoření streamu pomocí metody Stream.builder() s instancí Stream.Builder

Můžeme také použít Stream Builder k vytvoření streamu pomocí návrhového vzoru builder. Je navržen tak, aby krok za krokem sestavoval objekty. Podívejme se, jak můžeme pomocí Stream Builderu vytvořit instanci streamu.

Stream.Builder numBuilder = Stream.builder(); numBuilder.add(1).add(2).add( 3); Stream numStream = numBuilder.build(); 

Pomocí tohoto kódu můžete vytvořit stream s názvem numStream obsahující celočíselné prvky. To vše se dělá poměrně rychle díky instanci Stream.Builder s názvem numBuilder, která se vytvoří jako první.

3. Vytvořte stream se zadanými hodnotami pomocí metody Stream.of()

Dalším způsobem, jak vytvořit stream, je použití metody Stream.of(). Jedná se o jednoduchý způsob, jak vytvořit stream s danými hodnotami. Metoda deklaruje a také inicializuje stream. Příklad použití metody Stream.of() k vytvoření streamu:

Stream numStream = Stream.of(1, 2, 3); 

Tento kód vytvoří stream obsahující celočíselné prvky, jak jsme to již udělali v předchozí metodě pomocí Stream.Builder. Zde jsme přímo vytvořili stream pomocí Stream.of() s předdefinovanými hodnotami [1, 2 a 3].

4. Vytvoření streamu z existujícího pole pomocí metody Arrays.stream()

Další běžnou metodou vytváření streamu je použití polí v Javě. Stream je zde vytvořen z existujícího pole pomocí metody Arrays.stream(). Všechny prvky pole jsou převedeny na prvky streamu. Zde je vizuální příklad:

Integer[] arr = ; Stream numStream = Arrays.stream(arr); 

Tento kód vygeneruje numStream obsahující obsah pole s názvem arr, což je celočíselné pole.

5. Sloučení dvou existujících streamů pomocí metody Stream.concat()

Další metodou, kterou lze použít k vytvoření streamu, je metoda Stream.concat(). Používá se ke zřetězení dvou streamů a vytvoření jednoho streamu. Oba streamy jsou zřetězeny v pořadí. To znamená, že první stream je na prvním místě, následovaný druhým streamem atd. Příklad takového zřetězení vypadá takto:

Stream numStream1 = Stream.of(1, 2, 3, 4, 5); Stream numStream2 = Stream.of(1, 2, 3); Stream combinedStream = Stream.concat( numStream1, numStream2); 

Výše uvedený příkaz vytvoří finální stream s názvem combinedStream, který bude obsahovat prvky prvního streamu numStream1 a druhého streamu numStream2 jeden po druhém.

Typy operací Java Stream

Jak již bylo zmíněno, v Javě 8 lze pomocí Java Stream provádět dva typy operací: mezilehlé a terminálové. Pojďme se na každou z nich podívat podrobněji.

Mezilehlé operace

Mezilehlé operace generují výstupní proud a jsou provedeny pouze tehdy, když narazí na terminálovou operaci. To znamená, že mezilehlé operace jsou prováděny líně, pipelined a lze je dokončit pouze terminálovou operací. O líném vyhodnocování a pipeline zpracování se dozvíte o něco později. Příklady mezilehlých operací jsou následující metody: filter(), map(), different(), peek(), sorted() a některé další.

Přečtěte si více
Gepon: návod k použití léku

Provoz terminálu

Terminální operace dokončují provádění mezilehlých operací a vracejí konečné výsledky výstupního streamu. Protože terminálové operace signalizují konec líného provádění a pipeline, nelze stream po provedení terminálové operace znovu použít. Příklady terminálových operací jsou následující metody: forEach(), collect(), count(), reduce() atd.

Příklady operací s Java streamem

Mezilehlé operace

Zde je několik příkladů mezilehlých operací, které lze použít v Java Stream:

filtr()

Tato metoda se používá k filtrování prvků ze streamu, které odpovídají určitému predikátu v Javě. Tyto filtrované prvky pak tvoří nový stream. Pro lepší pochopení se podívejme na příklad.

Stream numStream = Stream.of(43, 65, 1, 98, 63); List even = numStream.filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(even); 

Vysvětlení: V tomto příkladu vidíte, že sudé prvky (dělitelné 2) jsou filtrovány pomocí metody filter() a uloženy v celočíselném seznamu numStream, jehož obsah je později vypsán. Protože 98 je jediné sudé celé číslo v proudu, je vypsáno i ve výstupu.

mapa()

Tato metoda se používá k vytvoření nového streamu provedením souvisejících funkcí na prvcích původního vstupního streamu. Nový stream může mít jiný datový typ. Příklad je následující:

Stream numStream = Stream.of(43, 65, 1, 98, 63); List d = numStream.map(n -> n*2) .collect(Collectors.toList()); System.out.println(d); 
[86, 130, 2, 196, 126]

Vysvětlení: Zde vidíme, že metoda map() se používá k jednoduchému zdvojnásobení každého prvku numStream. Jak je vidět z výstupu, každý z prvků ve streamu byl úspěšně zdvojnásoben.

odlišný()

Tato metoda se používá k extrakci pouze specifických prvků v datovém proudu filtrováním duplikátů. Příklad je následující:

Stream numStream = Stream.of(43,65,1,98,63,63,1); List numList = numStream.distinct() .collect(Collectors.toList()); System.out.println(numList); 

Vysvětlení: V tomto případě se pro numStream používá metoda distinct(). Extrahuje všechny odlišné prvky v numList odstraněním duplikátů ze streamu. Jak je vidět z výstupu, na rozdíl od vstupního streamu, který zpočátku obsahoval dva duplikáty (63 a 1), neexistují žádné duplikáty.

nahlédnout ()

Tato metoda se používá ke sledování mezilehlých změn před provedením terminálové operace. To znamená, že peek() lze použít k provedení operace s každým prvkem streamu a vytvořit tak stream, na kterém lze provádět další mezilehlé operace.

Stream numStream = Stream.of(43, 65, 1, 98, 63); List nList = numStream.map(n -> n*10) .peek(n->System.out.println("Mapped: "+ n)) .collect(Collectors.toList()); System.out.println(nList); 

Namapováno: 430 Namapováno: 650 Namapováno: 10 Namapováno: 980 Namapováno: 630 [430, 650, 10, 980, 630]

Vysvětlení: Zde se metoda peek() používá ke generování mezivýsledků, protože metoda map() je aplikována na prvky streamu. Zde si můžeme všimnout, že ještě předtím, než je terminálová operace collect() aplikována k výpisu konečného obsahu seznamu v příkazu print, je výsledek pro každé mapování prvku streamu vytištěn postupně předem.

seřazeno()

Metoda sorted() se používá k řazení prvků streamu. Ve výchozím nastavení řadí prvky vzestupně. Můžete také zadat konkrétní pořadí řazení jako parametr. Příklad implementace této metody vypadá takto:

Stream numStream = Stream.of(43, 65, 1, 98, 63); numStream.sorted().forEach(n -> System.out.println(n)); 

Vysvětlení: Zde se metoda sorted() standardně používá k vzestupnému řazení prvků streamu (protože není zadáno žádné konkrétní pořadí). Vidíte, že prvky vypsané ve výstupu jsou seřazeny vzestupně.

Přečtěte si více
Recenze lepidlové pasti na chytání krys a myší Gryzunoff

Provoz terminálu

Zde je několik příkladů terminálových operací, které lze použít na streamy Java:

pro každého()

Metoda forEach() se používá k iteraci všemi prvky streamu a k provedení funkce pro každý prvek jeden po druhém. Funguje jako alternativa k příkazům v cyklech, jako například for, while a dalším. Příklad:

Stream numStream = Stream.of(43, 65, 1, 98, 63); numStream.forEach(n -> System.out.println(n)); 

43 65 1 98 63
Vysvětlení: Metoda forEach() se zde používá k postupnému vypsání každého prvku streamu.

počet()

Metoda count() se používá k načtení celkového počtu prvků přítomných ve streamu. Je podobná metodě size(), která se často používá k určení celkového počtu prvků v kolekci. Příklad použití metody count() s Java streamem je následující:

Stream numStream = Stream.of(43, 65, 1, 98, 63); System.out.println(numStream.count()); 

Vysvětlení: Protože numStream obsahuje 5 celočíselných prvků, použití metody count() na něm vypíše hodnotu 5.

sbírat()

Metoda collect() se používá k provádění proměnlivých redukcí prvků streamu. Lze ji použít k odstranění obsahu ze streamu po dokončení zpracování. K provádění redukcí používá třídu Collector.

Stream numStream = Stream.of(43, 65, 1, 98, 63); List odd = numStream.filter(n -> n % 2 == 1) .collect(Collectors.toList()); System.out.println(odd); 

Vysvětlení: Tento příklad filtruje všechny liché prvky v proudu a shromažďuje/redukuje je do seznamu s názvem liché. Seznam lichých prvků se vypíše na konci.

min() a max()

Metoda min(), jak název napovídá, může být použita ve streamu k nalezení minimálního prvku v něm. Podobně lze metodu max() použít k nalezení maximálního prvku ve streamu. Zkusme pochopit, jak je lze použít na příkladu:

Stream numStream = Stream.of(43, 65, 1, 98, 63); int smallest = numStream.min((m, n) -> Integer.compare(m, n)).get(); System.out.println("Smallest element: " + smallest); 
numStream = Stream.of(43, 65, 1, 98, 63); int largest = numStream.max((m, n) -> Integer.compare(m, n)).get(); System.out.println("Largest element: " + largest); 

Nejmenší prvek: 1 Největší prvek: 98

Vysvětlení: V tomto příkladu jsme vytiskli nejmenší prvek v numStream pomocí metody min() a největší prvek pomocí metody max(). Všimněte si, že zde jsme před použitím metody max() přidali prvky zpět do numStream. Je to proto, že min() je terminálová operace a ničí obsah původního streamu a vrací pouze konečný výsledek (kterým bylo v tomto případě celé číslo „smallest“).

najítLibovolný() a najítPrvní()

Metoda findAny() vrací libovolný prvek streamu jako Optional. Pokud je stream prázdný, vrátí také hodnotu Optional, která bude prázdná. Metoda findFirst() vrací první prvek streamu jako Optional. Stejně jako metoda findAny() vrací metoda findFirst() také prázdný Optional, pokud je odpovídající stream prázdný. Podívejme se na následující příklad založený na těchto metodách:

Stream numStream = Stream.of(43, 65, 1, 98, 63); Optional opt = numStream.findFirst();System.out.println(opt); numStream = Stream.empty(); opt = numStream.findAny();System.out.println(opt); 

Vysvětlení: V prvním případě metoda findFirst() vrací první prvek streamu jako Optional. Poté, když je stream přeřazen jako prázdný stream, metoda findAny() vrací prázdný Optional.

Přečtěte si více
Jak opravit 220voltovou LED žárovku: oprava a upevnění | Blog Svět světla

allMatch(), anyMatch() a noneMatch()

Metoda allMatch() se používá k ověření, zda všechny prvky v streamu odpovídají určitému predikátu, a vrací booleovskou hodnotu. pravdivý, pokud ano, jinak vrátí nepravdivýPokud je stream prázdný, vrátí pravdivýMetoda anyMatch() se používá k kontrole, zda některý z prvků v streamu odpovídá určitému predikátu. Vrací hodnotu. pravdivý, pokud ano, a nepravdivý jinak, pokud je proud prázdný, vrátí nepravdivýMetoda noneMatch() vrací hodnotu pravdivý, pokud žádný prvek proudu neodpovídá predikátu a nepravdivý jinak. Příklad ilustrující to je následující:

Stream numStream = Stream.of(43, 65, 1, 98, 63); boolean flag = numStream.allMatch(n -> n1); System.out.println(flag); numStream = Stream.of(43, 65, 1, 98, 63); flag = numStream.anyMatch(n -> n1); System.out.println(flag); numStream = Stream.of(43, 65, 1, 98, 63); flag = numStream.noneMatch(n -> n==1);System.out.println(flag); 

nepravdivé pravdivé nepravdivé

Vysvětlení: Pro proud numStream obsahující prvek 1 vrací metoda allMatch() hodnotu nepravdivý, protože ne všechny prvky jsou rovny 1, ale pouze jeden z nich. Metoda anyMatch() vrací pravdivý, protože alespoň jeden z prvků je roven 1. Metoda noneMatch() vrací nepravdivý, protože 1 skutečně existuje jako prvek v tomto proudu.

Líné vyhodnocení v Java Streamu

Líné vyhodnocování je optimalizace při práci s Java streamy v Javě 8. Zahrnuje hlavně zpoždění provádění mezilehlých operací, dokud není narazeno na terminálovou operaci. Líné vyhodnocování je zodpovědné za prevenci zbytečných výpočetních nákladů, dokud není výsledek skutečně potřeba. Výstupní stream, který je výsledkem mezilehlých operací, je generován až po provedení terminálové operace. Líné vyhodnocování funguje se všemi mezilehlými operacemi v Java streamech. Velmi užitečnou aplikací líného vyhodnocování je práce s nekonečnými streamy. V tomto případě se vyhneme velkému množství zbytečného zpracování.

Kanály v Java Streamu

Pipeline (kanál) v Java Stream se skládá ze vstupního streamu, nuly nebo více mezilehlých operací, jedné po druhé, a nakonec terminálové operace. Mezilehlé operace v Java Stream se provádějí líně. Díky tomu jsou mezilehlé operace v pipeline nevyhnutelné. Díky pipelinem, což jsou v podstatě mezilehlé operace zřetězené v určitém pořadí, je možné líné provádění. Pipeline pomáhají sledovat mezilehlé operace, které je třeba provést poté, co je konečně nalezena terminálová operace.

Závěr

  1. Stručně jsme se podívali na to, co jsou Java streamy.
  2. Pak jsme se naučili mnoho různých metod pro vytváření vláken Java v Javě 8.
  3. Prozkoumali jsme dva hlavní typy operací (mezilehlé operace a terminálové operace), které lze provádět s Java streamy.
  4. Poté jsme se podrobně podívali na několik příkladů mezilehlých i koncových operací.
  5. Nakonec jsme se dozvěděli více o líném vyhodnocování a prozkoumali pipelinování v Java streamech.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button