Java предоставя нов допълнителен пакет в Java 8, наречен java.util.stream. Този пакет се състои от класове, интерфейси и enum, за да позволи операции във функционален стил върху елементите. Можете да използвате поток чрез импортиране на пакет java.util.stream.
Потокът предоставя следните функции:
- Потокът не съхранява елементи. Той просто предава елементи от източник, като например структура от данни, масив или I/O канал, чрез конвейер от изчислителни операции.
- Потокът е функционален по природа. Операциите, извършени върху поток, не променят неговия източник. Например филтрирането на поток, получен от колекция, създава нов поток без филтрираните елементи, вместо да премахва елементи от колекцията източник.
- Потокът е мързелив и оценява кода само когато е необходимо.
- Елементите на потока се посещават само веднъж през живота на потока. Подобно на итератор, трябва да се генерира нов поток, за да се преразгледат същите елементи на източника.
Можете да използвате поток за филтриране, събиране, отпечатване и конвертиране от една структура на данни в друга и т.н. В следващите примери сме приложили различни операции с помощта на поток.
Методи на Java Stream Interface
Методи | Описание |
---|---|
boolean allMatch(предикат предикат) | Той връща всички елементи от този поток, които съответстват на предоставения предикат. Ако потокът е празен, тогава се връща true и предикатът не се оценява. |
boolean anyMatch(предикат предикат) | Той връща всеки елемент от този поток, който съответства на предоставения предикат. Ако потокът е празен, тогава се връща false и предикатът не се оценява. |
статичен Stream.Builder builder() | Той връща конструктор за поток. |
R collect (колектор колектор) | Той изпълнява операция за променлива редукция върху елементите на този поток, използвайки колектор. Колекторът капсулира функциите, използвани като аргументи за събиране (Доставчик, BiConsumer, BiConsumer), позволявайки повторно използване на стратегии за събиране и състав на операции за събиране, като групиране или разделяне на няколко нива. |
R събиране (доставчик доставчик, BiConsumer акумулатор, BiConsumer комбиниращ) | Той извършва променлива редукционна операция върху елементите на този поток. Променлива редукция е такава, при която намалената стойност е променлив контейнер за резултат, като например ArrayList, и елементите се включват чрез актуализиране на състоянието на резултата, а не чрез замяна на резултата. |
статичен поток concat (поток a, поток b) | Той създава лениво свързан поток, чиито елементи са всички елементи на първия поток, последвани от всички елементи на втория поток. Полученият поток е подреден, ако и двата входни потока са подредени, и паралелен, ако някой от входните потоци е паралелен. Когато полученият поток е затворен, се извикват манипулаторите за затваряне и за двата входни потока. |
дълго броене() | Връща броя на елементите в този поток. Това е частен случай на намаление. |
Поток distinct() | Той връща поток, състоящ се от отделните елементи (според Object.equals(Object)) на този поток. |
статичен поток празен() | Връща празен последователен поток. |
Филтър за поток (предикат предикат) | Той връща поток, състоящ се от елементите на този поток, които съответстват на дадения предикат. |
По избор findAny() | Той връща Optional, описващ някакъв елемент от потока, или празен Optional, ако потокът е празен. |
Незадължително findFirst() | Той връща Optional, описващ първия елемент от този поток, или празен Optional, ако потокът е празен. Ако потокът няма ред на среща, тогава всеки елемент може да бъде върнат. |
Поток flatMap(функция super T,? extends Stream>картограф) | Той връща поток, състоящ се от резултатите от заместването на всеки елемент от този поток със съдържанието на картографиран поток, получен чрез прилагане на предоставената функция за картографиране към всеки елемент. Всеки картографиран поток се затваря, след като съдържанието му бъде поставено в този поток. (Ако картографиран поток е нула, вместо това се използва празен поток.) |
DoubleStream flatMapToDouble(функционален картограф) | Той връща DoubleStream, състоящ се от резултатите от заместването на всеки елемент от този поток със съдържанието на картографиран поток, получен чрез прилагане на предоставената функция за картографиране към всеки елемент. Всеки картографиран поток се затваря, след като съдържанието му е поставено в този поток. (Ако картографиран поток е нула, вместо това се използва празен поток.) |
IntStream flatMapToInt(функция картограф) | Той връща IntStream, състоящ се от резултатите от заместването на всеки елемент от този поток със съдържанието на картографиран поток, получен чрез прилагане на предоставената функция за картографиране към всеки елемент. Всеки картографиран поток се затваря, след като съдържанието му бъде поставено в този поток. (Ако картографиран поток е нула, вместо това се използва празен поток.) |
LongStream flatMapToLong (функция картограф) | Той връща LongStream, състоящ се от резултатите от заместването на всеки елемент от този поток със съдържанието на картографиран поток, получен чрез прилагане на предоставената функция за картографиране към всеки елемент. Всеки картографиран поток се затваря, след като съдържанието му бъде поставено в този поток. (Ако картографиран поток е нула, вместо това се използва празен поток.) |
void forEach(действие на потребителя) | Той изпълнява действие за всеки елемент от този поток. |
void forEachOrdered(действие на потребителя) | Той изпълнява действие за всеки елемент от този поток, в реда на среща на потока, ако потокът има дефиниран ред на среща. |
генериране на статичен поток (доставчици) | Той връща безкраен последователен неподреден поток, където всеки елемент е генериран от предоставения доставчик. Това е подходящо за генериране на постоянни потоци, потоци от произволни елементи и т.н. |
итерация на статичен поток (T seed,UnaryOperator f) | Той връща безкраен последователен подреден поток, произведен чрез итеративно прилагане на функция f към първоначално начално начало на елемент, създавайки поток, състоящ се от начално число, f(семе), f(f(семе)) и т.н. |
Ограничение на потока (дълъг макс. размер) | Той връща поток, състоящ се от елементите на този поток, съкратени, за да не са по-дълги от maxSize по дължина. |
Карта на потока (функционален картограф) | Той връща поток, състоящ се от резултатите от прилагането на дадена функция към елементите на този поток. |
DoubleStream mapToDouble(ToDoubleFunction картограф) | Той връща DoubleStream, състоящ се от резултатите от прилагането на дадената функция към елементите на този поток. |
IntStream mapToInt(ToIntFunction картограф) | Той връща IntStream, състоящ се от резултатите от прилагането на дадената функция към елементите на този поток. | LongStream mapToLong(ToLongFunction картограф) | Той връща LongStream, състоящ се от резултатите от прилагането на дадената функция към елементите на този поток. |
Незадължителен макс (компаратор за сравнение) | Той връща максималния елемент от този поток според предоставения Comparator. Това е частен случай на намаление. |
Незадължителен min (компаратор за сравнение) | Той връща минималния елемент от този поток според предоставения Comparator. Това е частен случай на намаление. |
boolean noneMatch(предикат предикат) | Връща елементи от този поток, съответстващи на предоставения предикат. Ако потокът е празен, тогава се връща true и предикатът не се оценява. |
@SafeVarargs статичен поток от (T... стойности) | Той връща последователен подреден поток, чиито елементи са посочените стойности. |
статичен поток от (T t) | Той връща последователен поток, съдържащ един елемент. |
Надникване на поток (действие на потребителя) | Той връща поток, състоящ се от елементите на този поток, като допълнително изпълнява предоставеното действие върху всеки елемент, тъй като елементите се консумират от резултантния поток. |
Незадължително намаляване (акумулатор на двоичен оператор) | Той извършва намаляване на елементите на този поток, като използва функция за асоциативно натрупване и връща опция, описваща намалената стойност, ако има такава. |
T reduce(T identity, BinaryOperator collector) | Той извършва редукция на елементите на този поток, като използва предоставената стойност за идентичност и функция за асоциативно натрупване и връща намалената стойност. |
U намалява (U идентичност, BiFunction акумулатор, BinaryOperator комбинатор) | Той извършва редукция на елементите на този поток, като използва предоставените функции за идентичност, натрупване и комбиниране. |
Пропускане на поток (дълго n) | Той връща поток, състоящ се от останалите елементи на този поток след отхвърляне на първите n елемента от потока. Ако този поток съдържа по-малко от n елемента, тогава ще бъде върнат празен поток. |
Потокът е сортиран() | Той връща поток, състоящ се от елементите на този поток, сортирани според естествения ред. Ако елементите на този поток не са сравними, може да бъде хвърлено изключение java.lang.ClassCastException, когато се изпълнява операцията на терминала. |
Потокът е сортиран (компаратор за сравнение) | Той връща поток, състоящ се от елементите на този поток, сортирани според предоставения Comparator. |
Object[] toArray() | Той връща масив, съдържащ елементите на този поток. |
A[] toArray(генератор на IntFunction) | Той връща масив, съдържащ елементите на този поток, като използва предоставената генераторна функция за разпределяне на върнатия масив, както и всички допълнителни масиви, които може да са необходими за разделено изпълнение или за преоразмеряване. |
Пример за Java: Филтриране на колекция без използване на поток
В следващия пример филтрираме данни, без да използваме поток. Този подход използваме преди пускането на пакета за поток.
щати в САЩ
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){>
Пример за Java Stream: Филтриране на колекция с помощта на Stream
Тук филтрираме данни с помощта на поток. Можете да видите, че кодът е оптимизиран и поддържан. Потокът осигурява бързо изпълнение.
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); } }
Изход:
[90000.0]
Пример за повторение на Java поток
Можете да използвате поток, за да повтаряте произволен брой пъти. Stream предоставя предварително дефинирани методи за работа с логиката, която прилагате. В следващия пример ние итерираме, филтрираме и предаваме ограничение, за да коригираме итерацията.
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); } }
Изход:
5 10 15 20 25
Пример за Java Stream: Колекция за филтриране и итерация
В следващия пример използваме метод filter(). Тук можете да видите, че кодът е оптимизиран и много кратък.
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)); } }
Изход:
Dell Laptop
Пример за поток на Java: метод reduce() в колекция
Този метод взема поредица от входни елементи и ги комбинира в един обобщен резултат чрез повтаряща се операция. Например намиране на сумата от числа или натрупване на елементи в списък.
В следващия пример използваме метода reduce(), който се използва за сумиране на цените на всички продукти.
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); } }
Изход:
201000.0 201000.0
Пример за Java Stream: Сумиране чрез използване на методи за събиране
Можем също да използваме колектори, за да изчислим сумата от числови стойности. В следващия пример използваме клас Collectors и неговите специфицирани методи за изчисляване на сумата от цените на всички продукти.
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); } }
Изход:
201000.0
Пример за Java поток: Намерете максимална и минимална цена на продукта
Следващият пример намира минимална и максимална цена на продукта чрез използване на поток. Предоставя удобен начин за намиране на стойности без използване на императивен подход.
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); } }
Изход:
90000.0 25000.0
Пример за поток на Java: метод count() в колекция
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)>
потокът ви позволява да събирате резултата си във всякакви различни форми. Можете да получите резултат като набор, списък или карта и можете да извършвате манипулации върху елементите.
Пример за Java поток: Преобразуване на списък в набор
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); } }
Изход:
[25000.0, 28000.0]
Пример за поток на Java: Преобразуване на списък в карта
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); } }
Изход:
{1=HP Laptop, 2=Dell Laptop, 3=Lenevo Laptop, 4=Sony Laptop, 5=Apple Laptop}
Референция на метода в поток
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); } }
Изход:
[90000.0]
30000)>30000){>