Jak se naučit Java Stream API [+5 Resources]

Proud v Javě je posloupnost prvků, na kterých lze provádět sekvenční nebo paralelní operace.

Může existovat „n“ počet mezioperačních operací a nakonec operace terminálu, po které je vrácen výsledek.

Co je to proud?

Streamy lze spravovat pomocí Stream API, které bylo představeno v Javě 8.

Představte si Stream jako výrobní potrubí, ve kterém je potřeba některé zboží vyrobit, roztřídit a poté zabalit k odeslání. V Javě jsou tímto zbožím předměty nebo kolekce předmětů, operacemi jsou výroba, třídění a balení a potrubím je proud.

Součásti streamu jsou:

  • Počáteční vstup
  • Mezioperační operace
  • Provoz terminálu
  • Konečný výsledek

Pojďme prozkoumat některé funkce streamu v Javě:

  • Stream není datová struktura v paměti; spíše je to posloupnost polí, objektů nebo kolekcí objektů, které jsou ovládány určitými metodami.
  • Streamy mají deklarativní charakter, tj. určujete, co se má dělat, ale ne jak to dělat.
  • Mohou být spotřebovány pouze jednou, protože nejsou nikde skladovány.
  • Stream nemění původní datovou strukturu; pouze z něj odvozuje novou strukturu.
  • Vrací konečný výsledek odvozený z konečné metody v potrubí.

Stream API vs. Collections Processing

Kolekce je datová struktura v paměti, která ukládá a zpracovává data. Kolekce poskytují datové struktury, jako je sada, mapa, seznam atd., pro ukládání dat. Na druhou stranu je stream způsob, jak efektivně přenášet data po jejich zpracování prostřednictvím potrubí.

Zde je příklad kolekce ArrayList:-

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(0, 3);
        System.out.println(list);
    }
}

Output: 
[3]

Jak můžete vidět ve výše uvedeném příkladu, můžete vytvořit kolekci ArrayList, uložit do ní data a poté s těmito daty pracovat pomocí různých metod.

  11 nástrojů pro parafrázování pro zlepšení kvality vašeho obsahu

Pomocí streamu můžete pracovat s existující datovou strukturou a vrátit novou upravenou hodnotu. Níže je uveden příklad vytvoření kolekce ArrayList a její filtrování pomocí streamu.

import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();

        for (int i = 0; i < 20; i++) {
            list.add(i+1);
        }

        System.out.println(list);

        Stream<Integer> filtered = list.stream().filter(num -> num > 10);
        filtered.forEach(num -> System.out.println(num + " "));
    }
}

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

Ve výše uvedeném příkladu je proud vytvořen pomocí existujícího seznamu a seznam je iterován pro filtrování hodnot větších než 10. Všimněte si, že proud neukládá nic, seznam se pouze iteruje a výsledek se vytiskne. Pokud se pokusíte datový proud vytisknout, získáte místo hodnot odkaz na proud.

Práce na Java Stream API

Java Stream API přijímá zdrojovou kolekci prvků nebo posloupnost prvků a poté s nimi provádí operace k odvození konečného výsledku. Proud je jen potrubí, kterým prochází sled prvků a nějakým způsobem se transformuje.

Stream lze vytvořit z různých zdrojů, včetně:

  • Kolekce, jako je seznam nebo sada.
  • Pole.
  • Ze souborů a jejich cest pomocí bufferu.

V proudu se provádějí dva typy operací: –

  • Mezilehlé operace
  • Terminálové operace

Mezilehlé vs. terminálové operace

Každá přechodná operace interně vrátí nový proud, který transformuje vstup pomocí zadané metody. Nic se ve skutečnosti neprochází; Místo toho je předán do dalšího proudu. Pro dosažení požadovaného výsledku je proud překročen pouze při terminálové operaci.

Máte například seznam 10 čísel, která chcete odfiltrovat a poté na něco namapovat. Ne každý prvek seznamu bude procházet okamžitě, abyste získali filtrovaný výsledek a namapovali jej na něco jiného. Místo toho budou jednotlivé prvky zkontrolovány, a pokud splňují podmínku, budou mapovány. Nové streamy pro každý prvek.

  Jak hrát Portal 2 na Linuxu

Mapová operace bude provedena na jednotlivých položkách, které vyhovují filtru, nikoli na celém seznamu. A v době provozu terminálu jsou procházeny a spojeny do jediného výsledku.

Po provedení operace terminálu je proud spotřebován a nelze jej dále používat. Chcete-li znovu provádět stejné operace, musíte vytvořit nový datový proud.

Zdroj: The Bored Dev

S pochopením toho, jak proudy fungují na úrovni povrchu, pojďme skočit do podrobností implementace proudů v Javě.

#1. Prázdný proud

Vytvořte prázdný datový proud pomocí prázdné metody rozhraní Stream API.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream emptyStream = Stream.empty();
        System.out.println(emptyStream.count());
    }
}

Output:
0

Zde, pokud vytisknete počet prvků v tomto proudu, dostanete jako výstup 0, protože se jedná o prázdný proud bez prvků. Prázdné datové proudy jsou docela užitečné při vyhýbání se výjimkám nulových ukazatelů.

#2. Streamujte ze sbírek

Kolekce, jako jsou seznamy a sada, odhalují metodu stream(), která vám umožňuje vytvořit proud z kolekce. Vytvořený proud lze poté procházet a získat konečný výsledek.

ArrayList<Integer> list = new ArrayList();

for (int i = 0; i < 20; i++) {
    list.add(i+1);
}

System.out.println(list);

Stream<Integer> filtered = list.stream().filter(num -> num > 10);
filtered.forEach(num -> System.out.println(num + " "));

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

#3. Streamujte z Arrays

Metoda Arrays.stream() se používá k vytvoření streamu z pole.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = new String[]{"this", "is", "etechblog.cz"};
        Arrays.stream(stringArray).forEach(item -> System.out.print(item + " "));
    }
}

#Output

this is etechblog.cz 

Můžete také zadat počáteční a koncový index prvků, z nichž chcete vytvořit proud. Počáteční index je inkluzivní, zatímco koncový index je výlučný.

String[] stringArray = new String[]{"this", "is", "etechblog.cz"};
Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " "));

Output:
is etechblog.cz

#4. Hledání minimálních a maximálních čísel pomocí Streams

Přístup k maximálnímu a minimálnímu počtu kolekce nebo pole lze provést pomocí komparátorů v Javě. Metody min() a max() přijímají komparátor a vracejí volitelný objekt.

Volitelný objekt je objekt typu kontejner, který může nebo nemusí obsahovat nenulovou hodnotu. Pokud obsahuje nenulovou hodnotu, volání metody get() na ní vrátí hodnotu.

import java.util.Arrays;
import java.util.Optional;

public class MinMax {
    public static void main(String[] args) {
        Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11};

        Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare);
        System.out.println(maxValue.get());

        Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare);
        System.out.println(minValue.get());
    }
}

#Output
82
3

Výukové zdroje

Nyní, když máte základní znalosti o streamech v Javě, zde je 5 zdrojů, abyste se dobře orientovali v Javě 8:

  Jak vyčistit nabíjecí port iPhone

#1. Java 8 v akci

Tato kniha je průvodcem představujícím nové funkce Java 8, včetně streamů, lambd a programování funkčních stylů. Součástí knihy jsou také kvízy a otázky pro ověření znalostí, které vám pomohou získat zpět to, co jste se naučili.

Tuto knihu můžete získat v brožovaném formátu i ve formátu audioknihy na Amazonu.

#2. Java 8 Lambdas: Funkční programování pro masy

Tato kniha je speciálně navržena tak, aby naučila základní vývojáře Java SE, jak přidání výrazů Lambda ovlivňuje jazyk Java. Obsahuje plynulá vysvětlení, kódová cvičení a příklady, abyste zvládli Java 8 lambda výrazy.

Je k dispozici v brožovaném formátu a edici Kindle na Amazonu.

#3. Java SE 8 pro opravdu netrpělivé

Pokud jste zkušený vývojář Java SE, tato kniha vás provede vylepšeními v Java SE 8, stream API, přidáním výrazů lambda, vylepšeními souběžného programování v Javě a některými funkcemi Java 7, které většina lidí nezná. nevím o.

Na Amazonu je k dispozici pouze v brožovaném formátu.

#4. Naučte se funkční programování v Javě s Lambdas & Streams

Tento kurz od Udemy zkoumá základy funkcionálního programování v Javě 8 a 9. Výrazy lambda, odkazy na metody, proudy a funkční rozhraní jsou pojmy, na které se kurz zaměřuje.

Obsahuje také spoustu Java hádanek a cvičení souvisejících s funkčním programováním.

#5. Knihovna tříd Java

Java Class Library je součástí specializace Core Java, kterou nabízí Coursera. Naučí vás, jak psát typově bezpečný kód pomocí Java Generics, porozumět knihovně tříd sestávající z více než 4000 tříd, jak pracovat se soubory a ošetřit chyby za běhu. Pro absolvování tohoto kurzu však existují určité předpoklady:

  • Úvod do Javy
  • Úvod do objektově orientovaného programování v Javě
  • Objektově orientované hierarchie v Javě

Závěrečná slova

Java Stream API a zavedení funkcí Lambda v Javě 8 zjednodušilo a zlepšilo spoustu věcí v Javě, jako je paralelní iterace, funkční rozhraní, méně kódu atd.

Proudy však mají určitá omezení; jejich největším omezením je, že je lze spotřebovat pouze jednou. Pokud jste vývojář Java, výše uvedené zdroje vám mohou pomoci porozumět těmto tématům mnohem podrobněji, takže je nezapomeňte zkontrolovat.

Můžete také chtít vědět o zpracování výjimek v Javě.