Java poskytuje nový dodatočný balík v jazyku Java 8 s názvom java.util.stream. Tento balík pozostáva z tried, rozhraní a enum, ktoré umožňujú operácie s prvkami vo funkčnom štýle. Stream môžete použiť importovaním balíka java.util.stream.
Stream poskytuje nasledujúce funkcie:
- Prúd neukladá prvky. Jednoducho prenáša prvky zo zdroja, ako je dátová štruktúra, pole alebo I/O kanál, prostredníctvom potrubia výpočtových operácií.
- Stream je svojou povahou funkčný. Operácie vykonané na streame nemenia jeho zdroj. Napríklad filtrovanie toku získaného z kolekcie vytvorí nový tok bez filtrovaných prvkov namiesto odstránenia prvkov zo zdrojovej kolekcie.
- Stream je lenivý a vyhodnocuje kód iba v prípade potreby.
- Prvky toku sú počas života toku navštívené iba raz. Podobne ako iterátor, aj tu sa musí vygenerovať nový tok, aby bolo možné znova navštíviť rovnaké prvky zdroja.
Pomocou streamu môžete filtrovať, zhromažďovať, tlačiť a konvertovať z jednej dátovej štruktúry do inej atď. V nasledujúcich príkladoch sme použili rôzne operácie pomocou streamu.
Metódy rozhrania Java Stream
Metódy | Popis |
---|---|
boolean allMatch (predikátový predikát) | Vráti všetky prvky tohto prúdu, ktoré sa zhodujú so zadaným predikátom. Ak je prúd prázdny, vráti sa true a predikát sa nevyhodnotí. |
boolean anyMatch (predikát predikátu) | Vráti akýkoľvek prvok tohto prúdu, ktorý sa zhoduje so zadaným predikátom. Ak je prúd prázdny, vráti sa false a predikát sa nevyhodnotí. |
statický nástroj Stream.Builder builder() | Vracia staviteľa pre prúd. |
R collect (zberateľ kolektora) | Vykonáva operáciu meniteľnej redukcie na prvkoch tohto prúdu pomocou kolektora. Kolektor zapuzdruje funkcie používané ako argumenty na zhromažďovanie (Dodávateľ, BiConsumer, BiConsumer), čo umožňuje opätovné použitie stratégií zberu a zloženie operácií zberu, ako je viacúrovňové zoskupovanie alebo rozdelenie. |
R collect (dodávateľ dodávateľa, akumulátor BiConsumer, zlučovač BiConsumer) | Vykonáva operáciu meniteľnej redukcie na prvkoch tohto prúdu. Meniteľné zníženie je také, v ktorom je znížená hodnota kontajnerom premeniteľných výsledkov, ako je ArrayList, a prvky sú začlenené aktualizáciou stavu výsledku, a nie nahradením výsledku. |
statický prúd concat (stream a, stream b) | Vytvára lenivo zreťazený prúd, ktorého prvkami sú všetky prvky prvého prúdu, za ktorým nasledujú všetky prvky druhého prúdu. Výsledný tok je usporiadaný, ak sú zoradené obidva vstupné toky, a paralelný, ak je jeden zo vstupných tokov paralelný. Keď je výsledný prúd zatvorený, vyvolajú sa obslužné programy zatvorenia pre oba vstupné prúdy. |
dlhý počet () | Vráti počet prvkov v tomto prúde. Toto je špeciálny prípad zníženia. |
Odlišný prúd () | Vracia prúd pozostávajúci z odlišných prvkov (podľa Object.equals(Object)) tohto prúdu. |
statický stream prázdny() | Vráti prázdny sekvenčný tok. |
Filter toku (predikátový predikát) | Vracia prúd pozostávajúci z prvkov tohto prúdu, ktoré sa zhodujú s daným predikátom. |
Voliteľné findAny() | Vracia voliteľné popisujúce nejaký prvok prúdu alebo prázdne voliteľné, ak je prúd prázdny. |
Voliteľné findFirst() | Vracia voliteľné popisujúce prvý prvok tohto prúdu alebo prázdne voliteľné, ak je prúd prázdny. Ak stream nemá poradie stretnutia, potom môže byť vrátený akýkoľvek prvok. |
Streamovať plochú mapu (Funkcia super T,? extends Stream>mapovač) | Vracia tok pozostávajúci z výsledkov nahradenia každého prvku tohto toku obsahom mapovaného toku vytvoreného aplikáciou poskytnutej mapovacej funkcie na každý prvok. Každý mapovaný tok sa po umiestnení jeho obsahu do tohto toku uzavrie. (Ak má mapovaný stream hodnotu null, použije sa namiesto neho prázdny stream.) |
DoubleStream flatMapToDouble (mapovač funkcií) | Vracia DoubleStream pozostávajúci z výsledkov nahradenia každého prvku tohto toku obsahom mapovaného toku vytvoreného aplikáciou poskytnutej mapovacej funkcie na každý prvok. Každý mapovaný prúd sa uzavrie po umiestnení jeho obsahu do tohto prúdu. (Ak má mapovaný stream hodnotu null, použije sa namiesto neho prázdny stream.) |
IntStream flatMapToInt (mapovač funkcií) | Vracia IntStream pozostávajúci z výsledkov nahradenia každého prvku tohto toku obsahom mapovaného toku vytvoreného aplikáciou poskytnutej mapovacej funkcie na každý prvok. Každý mapovaný tok sa po umiestnení jeho obsahu do tohto toku uzavrie. (Ak má mapovaný stream hodnotu null, použije sa namiesto neho prázdny stream.) |
LongStream flatMapToLong (mapovač funkcií) | Vracia LongStream pozostávajúci z výsledkov nahradenia každého prvku tohto toku obsahom mapovaného toku vytvoreného aplikáciou poskytnutej mapovacej funkcie na každý prvok. Každý mapovaný tok sa po umiestnení jeho obsahu do tohto toku uzavrie. (Ak má mapovaný stream hodnotu null, použije sa namiesto neho prázdny stream.) |
neplatné pre každého (akcia spotrebiteľa) | Vykonáva akciu pre každý prvok tohto prúdu. |
void forEachOrdered (akcia spotrebiteľa) | Vykonáva akciu pre každý prvok tohto prúdu v poradí stretnutí prúdu, ak má prúd definované poradie stretnutí. |
generovanie statického streamu (dodávateľ) | Vracia nekonečný sekvenčný neusporiadaný tok, kde každý prvok generuje poskytnutý dodávateľ. To je vhodné na generovanie konštantných tokov, tokov náhodných prvkov atď. |
iterácia statického streamu (seed T, UnaryOperator f) | Vracia nekonečný sekvenčný usporiadaný tok vytvorený iteratívnou aplikáciou funkcie f na počiatočné semeno prvku, čím sa vytvorí tok pozostávajúci zo semena, f(semena), f(f(seed)) atď. |
Limit streamu (dlhá maxSize) | Vracia tok pozostávajúci z prvkov tohto toku, skrátený tak, aby nebol dlhší ako maxSize. |
Streamová mapa (mapovač funkcií) | Vracia prúd pozostávajúci z výsledkov aplikácie danej funkcie na prvky tohto prúdu. |
DoubleStream mapToDouble (mapovač ToDoubleFunction) | Vracia DoubleStream pozostávajúci z výsledkov aplikácie danej funkcie na prvky tohto streamu. |
IntStream mapToInt (mapovač ToIntFunction) | Vracia IntStream pozostávajúci z výsledkov aplikácie danej funkcie na prvky tohto toku. | LongStream mapToLong (mapovač ToLongFunction) | Vracia LongStream pozostávajúci z výsledkov aplikácie danej funkcie na prvky tohto streamu. |
Voliteľné maximum (porovnávač komparátora) | Vráti maximálny prvok tohto prúdu podľa poskytnutého komparátora. Toto je špeciálny prípad zníženia. |
Voliteľné minimum (porovnávač komparátora) | Vracia minimálny prvok tohto prúdu podľa poskytnutého komparátora. Toto je špeciálny prípad zníženia. |
boolean noneMatch (predikátový predikát) | Vracia prvky tohto prúdu zhodné so zadaným predikátom. Ak je prúd prázdny, vráti sa true a predikát sa nevyhodnotí. |
@SafeVarargs statický tok (hodnoty T...) | Vracia sekvenčný usporiadaný tok, ktorého prvkami sú špecifikované hodnoty. |
statický tok (T t) | Vracia sekvenčný tok obsahujúci jeden prvok. |
Náhľad streamu (spotrebiteľská akcia) | Vracia tok pozostávajúci z prvkov tohto toku, pričom navyše vykonáva poskytnutú akciu na každom prvku, keď sa prvky spotrebúvajú z výsledného toku. |
Voliteľné zníženie (akumulátor BinaryOperator) | Vykoná redukciu prvkov tohto prúdu pomocou asociatívnej akumulačnej funkcie a vráti voliteľnú hodnotu popisujúcu zníženú hodnotu, ak existuje. |
T redukcia (T identita, BinaryOperator akumulátor) | Vykoná redukciu prvkov tohto prúdu pomocou poskytnutej hodnoty identity a funkcie asociatívnej akumulácie a vráti zníženú hodnotu. |
U redukcia (identita U, akumulátor BiFunction, zlučovač BinaryOperator) | Vykonáva redukciu prvkov tohto prúdu pomocou poskytnutých funkcií identity, akumulácie a kombinovania. |
Preskočenie streamu (dlhé n) | Vracia prúd pozostávajúci zo zostávajúcich prvkov tohto prúdu po vyradení prvých n prvkov prúdu. Ak tento tok obsahuje menej ako n prvkov, vráti sa prázdny tok. |
Stream zoradený() | Vracia prúd pozostávajúci z prvkov tohto prúdu zoradených podľa prirodzeného poriadku. Ak prvky tohto toku nie sú porovnateľné, pri vykonávaní operácie terminálu môže byť vyvolaná výnimka java.lang.ClassCastException. |
Stream zoradený (porovnávač komparátora) | Vracia prúd pozostávajúci z prvkov tohto prúdu zoradených podľa poskytnutého porovnávača. |
Object[] toArray() | Vracia pole obsahujúce prvky tohto prúdu. |
A[] toArray (generátor IntFunction) | Vracia pole obsahujúce prvky tohto toku pomocou poskytnutej funkcie generátora na pridelenie vráteného poľa, ako aj všetky ďalšie polia, ktoré môžu byť potrebné na vykonanie rozdelenia alebo zmenu veľkosti. |
Príklad Java: Filtrovanie kolekcie bez použitia Stream
V nasledujúcom príklade filtrujeme údaje bez použitia streamu. Tento prístup používame pred vydaním streamového balíčka.
cout
import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); List productPriceList = new ArrayList(); for(Product product: productsList){ // filtering data of list if(product.price<30000){ productpricelist.add(product.price); adding price to a productpricelist } system.out.println(productpricelist); displaying data < pre> <p> <strong>Output:</strong> </p> <pre> [25000.0, 28000.0, 28000.0] </pre> <hr> <h3>Java Stream Example: Filtering Collection by using Stream</h3> <p>Here, we are filtering data by using stream. You can see that code is optimized and maintained. Stream provides fast execution.</p> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); List productPriceList2 =productsList.stream() .filter(p -> p.price > 30000)// filtering data .map(p->p.price) // fetching price .collect(Collectors.toList()); // collecting as list System.out.println(productPriceList2); } } </pre> <p> <strong>Output:</strong> </p> <pre> [90000.0] </pre> <hr> <h3>Java Stream Iterating Example</h3> <p>You can use stream to iterate any number of times. Stream provides predefined methods to deal with the logic you implement. In the following example, we are iterating, filtering and passed a limit to fix the iteration.</p> <pre> import java.util.stream.*; public class JavaStreamExample { public static void main(String[] args){ Stream.iterate(1, element->element+1) .filter(element->element%5==0) .limit(5) .forEach(System.out::println); } } </pre> <p> <strong>Output:</strong> </p> <pre> 5 10 15 20 25 </pre> <hr> <h3>Java Stream Example: Filtering and Iterating Collection</h3> <p>In the following example, we are using filter() method. Here, you can see code is optimized and very concise.</p> <pre> import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // This is more compact approach for filtering data productsList.stream() .filter(product -> product.price == 30000) .forEach(product -> System.out.println(product.name)); } } </pre> <p> <strong>Output:</strong> </p> <pre> Dell Laptop </pre> <hr> <h3>Java Stream Example : reduce() Method in Collection</h3> <p>This method takes a sequence of input elements and combines them into a single summary result by repeated operation. For example, finding the sum of numbers, or accumulating elements into a list. </p> <p>In the following example, we are using reduce() method, which is used to sum of all the product prices.</p> <pre> import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // This is more compact approach for filtering data Float totalPrice = productsList.stream() .map(product->product.price) .reduce(0.0f,(sum, price)->sum+price); // accumulating price System.out.println(totalPrice); // More precise code float totalPrice2 = productsList.stream() .map(product->product.price) .reduce(0.0f,Float::sum); // accumulating price, by referring method of Float class System.out.println(totalPrice2); } } </pre> <p> <strong>Output:</strong> </p> <pre> 201000.0 201000.0 </pre> <hr> <h3>Java Stream Example: Sum by using Collectors Methods</h3> <p>We can also use collectors to compute sum of numeric values. In the following example, we are using Collectors class and it?s specified methods to compute sum of all the product prices.</p> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Using Collectors's method to sum the prices. double totalPrice3 = productsList.stream() .collect(Collectors.summingDouble(product->product.price)); System.out.println(totalPrice3); } } </pre> <p> <strong>Output:</strong> </p> <pre> 201000.0 </pre> <hr> <h3>Java Stream Example: Find Max and Min Product Price</h3> <p>Following example finds min and max product price by using stream. It provides convenient way to find values without using imperative approach.</p> <pre> import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // max() method to get max Product price Product productA = productsList.stream().max((product1, product2)->product1.price > product2.price ? 1: -1).get(); System.out.println(productA.price); // min() method to get min Product price Product productB = productsList.stream().min((product1, product2)->product1.price > product2.price ? 1: -1).get(); System.out.println(productB.price); } } </pre> <p> <strong>Output:</strong> </p> <pre> 90000.0 25000.0 </pre> <hr> <h3>Java Stream Example: count() Method in Collection</h3> <pre> import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // count number of products based on the filter long count = productsList.stream() .filter(product->product.price<30000) .count(); system.out.println(count); } < pre> <p> <strong>Output:</strong> </p> <pre> 3 </pre> <p>stream allows you to collect your result in any various forms. You can get you result as set, list or map and can perform manipulation on the elements.</p> <hr> <h3>Java Stream Example : Convert List into Set</h3> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Converting product List into Set Set productPriceList = productsList.stream() .filter(product->product.price product.price) .collect(Collectors.toSet()); // collect it as Set(remove duplicate elements) System.out.println(productPriceList); } } </pre> <p> <strong>Output:</strong> </p> <pre> [25000.0, 28000.0] </pre> <hr> <h3>Java Stream Example : Convert List into Map</h3> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Converting Product List into a Map Map productPriceMap = productsList.stream() .collect(Collectors.toMap(p->p.id, p->p.name)); System.out.println(productPriceMap); } } </pre> <p> <strong>Output:</strong> </p> <pre> {1=HP Laptop, 2=Dell Laptop, 3=Lenevo Laptop, 4=Sony Laptop, 5=Apple Laptop} </pre> <hr> <h3>Method Reference in stream</h3> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } public int getId() { return id; } public String getName() { return name; } public float getPrice() { return price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); List productPriceList = productsList.stream() .filter(p -> p.price > 30000) // filtering data .map(Product::getPrice) // fetching price by referring getPrice method .collect(Collectors.toList()); // collecting as list System.out.println(productPriceList); } } </pre> <p> <strong>Output:</strong> </p> <pre> [90000.0] </pre> <hr></30000)></pre></30000){>
Príklad Java Stream: Filtrovanie kolekcie pomocou Stream
Tu filtrujeme údaje pomocou streamu. Môžete vidieť, že kód je optimalizovaný a udržiavaný. Stream poskytuje rýchle vykonávanie.
import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); List productPriceList2 =productsList.stream() .filter(p -> p.price > 30000)// filtering data .map(p->p.price) // fetching price .collect(Collectors.toList()); // collecting as list System.out.println(productPriceList2); } }
Výkon:
[90000.0]
Príklad iterácie Java streamu
Stream môžete použiť na opakovanie ľubovoľného počtu opakovaní. Stream poskytuje preddefinované metódy na riešenie vami implementovanej logiky. V nasledujúcom príklade iterujeme, filtrujeme a prekračujeme limit na opravu iterácie.
import java.util.stream.*; public class JavaStreamExample { public static void main(String[] args){ Stream.iterate(1, element->element+1) .filter(element->element%5==0) .limit(5) .forEach(System.out::println); } }
Výkon:
5 10 15 20 25
Príklad Java Stream: Filtrovanie a iterácia kolekcie
V nasledujúcom príklade používame metódu filter(). Tu môžete vidieť, že kód je optimalizovaný a veľmi stručný.
import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // This is more compact approach for filtering data productsList.stream() .filter(product -> product.price == 30000) .forEach(product -> System.out.println(product.name)); } }
Výkon:
Dell Laptop
Príklad Java Stream: Metóda redukcie() v kolekcii
Táto metóda používa sekvenciu vstupných prvkov a opakovanou operáciou ich spája do jedného súhrnného výsledku. Napríklad nájdenie súčtu čísel alebo hromadenie prvkov do zoznamu.
V nasledujúcom príklade používame metódu reduction(), ktorá sa používa na súčet všetkých cien produktov.
import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // This is more compact approach for filtering data Float totalPrice = productsList.stream() .map(product->product.price) .reduce(0.0f,(sum, price)->sum+price); // accumulating price System.out.println(totalPrice); // More precise code float totalPrice2 = productsList.stream() .map(product->product.price) .reduce(0.0f,Float::sum); // accumulating price, by referring method of Float class System.out.println(totalPrice2); } }
Výkon:
201000.0 201000.0
Príklad Java Stream: Súčet pomocou metód kolektorov
Na výpočet súčtu číselných hodnôt môžeme použiť aj kolektory. V nasledujúcom príklade používame triedu Collectors a jej špecifikované metódy na výpočet súčtu všetkých cien produktov.
import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Using Collectors's method to sum the prices. double totalPrice3 = productsList.stream() .collect(Collectors.summingDouble(product->product.price)); System.out.println(totalPrice3); } }
Výkon:
201000.0
Príklad Java Stream: Nájdite maximálnu a minimálnu cenu produktu
Nasledujúci príklad nájde minimálnu a maximálnu cenu produktu pomocou streamu. Poskytuje pohodlný spôsob, ako nájsť hodnoty bez použitia imperatívneho prístupu.
import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // max() method to get max Product price Product productA = productsList.stream().max((product1, product2)->product1.price > product2.price ? 1: -1).get(); System.out.println(productA.price); // min() method to get min Product price Product productB = productsList.stream().min((product1, product2)->product1.price > product2.price ? 1: -1).get(); System.out.println(productB.price); } }
Výkon:
90000.0 25000.0
Príklad Java Stream: metóda count() v kolekcii
import java.util.*; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // count number of products based on the filter long count = productsList.stream() .filter(product->product.price<30000) .count(); system.out.println(count); } < pre> <p> <strong>Output:</strong> </p> <pre> 3 </pre> <p>stream allows you to collect your result in any various forms. You can get you result as set, list or map and can perform manipulation on the elements.</p> <hr> <h3>Java Stream Example : Convert List into Set</h3> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Converting product List into Set Set productPriceList = productsList.stream() .filter(product->product.price product.price) .collect(Collectors.toSet()); // collect it as Set(remove duplicate elements) System.out.println(productPriceList); } } </pre> <p> <strong>Output:</strong> </p> <pre> [25000.0, 28000.0] </pre> <hr> <h3>Java Stream Example : Convert List into Map</h3> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Converting Product List into a Map Map productPriceMap = productsList.stream() .collect(Collectors.toMap(p->p.id, p->p.name)); System.out.println(productPriceMap); } } </pre> <p> <strong>Output:</strong> </p> <pre> {1=HP Laptop, 2=Dell Laptop, 3=Lenevo Laptop, 4=Sony Laptop, 5=Apple Laptop} </pre> <hr> <h3>Method Reference in stream</h3> <pre> import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } public int getId() { return id; } public String getName() { return name; } public float getPrice() { return price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); List productPriceList = productsList.stream() .filter(p -> p.price > 30000) // filtering data .map(Product::getPrice) // fetching price by referring getPrice method .collect(Collectors.toList()); // collecting as list System.out.println(productPriceList); } } </pre> <p> <strong>Output:</strong> </p> <pre> [90000.0] </pre> <hr></30000)>
stream vám umožňuje zbierať výsledky v rôznych formách. Môžete získať výsledok ako súbor, zoznam alebo mapu a môžete vykonávať manipuláciu s prvkami.
Príklad Java Stream : Konvertujte zoznam na Set
import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Converting product List into Set Set productPriceList = productsList.stream() .filter(product->product.price product.price) .collect(Collectors.toSet()); // collect it as Set(remove duplicate elements) System.out.println(productPriceList); } }
Výkon:
[25000.0, 28000.0]
Príklad Java Stream: Preveďte zoznam na mapu
import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); // Converting Product List into a Map Map productPriceMap = productsList.stream() .collect(Collectors.toMap(p->p.id, p->p.name)); System.out.println(productPriceMap); } }
Výkon:
{1=HP Laptop, 2=Dell Laptop, 3=Lenevo Laptop, 4=Sony Laptop, 5=Apple Laptop}
Odkaz na metódu v prúde
import java.util.*; import java.util.stream.Collectors; class Product{ int id; String name; float price; public Product(int id, String name, float price) { this.id = id; this.name = name; this.price = price; } public int getId() { return id; } public String getName() { return name; } public float getPrice() { return price; } } public class JavaStreamExample { public static void main(String[] args) { List productsList = new ArrayList(); //Adding Products productsList.add(new Product(1,'HP Laptop',25000f)); productsList.add(new Product(2,'Dell Laptop',30000f)); productsList.add(new Product(3,'Lenevo Laptop',28000f)); productsList.add(new Product(4,'Sony Laptop',28000f)); productsList.add(new Product(5,'Apple Laptop',90000f)); List productPriceList = productsList.stream() .filter(p -> p.price > 30000) // filtering data .map(Product::getPrice) // fetching price by referring getPrice method .collect(Collectors.toList()); // collecting as list System.out.println(productPriceList); } }
Výkon:
[90000.0]
30000)>30000){>