Автор оригинала: Pankaj Kumar.
Фильтр потока Java может быть очень полезен, когда вы хотите выполнить некоторую обработку только некоторых элементов потока на основе определенного условия.
Фильтр потока Java
Поток был представлен в Java 8. Фильтр потока Java является промежуточной операцией, т. е. возвращает новый поток.
Пример фильтра потока Java
Давайте рассмотрим простой пример подсчета четных чисел в списке целых чисел. Мы можем сделать это, как показано ниже.
ListintList = generateList(); //some method to create the list of integers int evenCount = 0; for(int i : intList){ if(i%2==0){ evenCount++; //code to do some processing } } System.out.println("Even Number Count: "+evenCount);
Теперь давайте посмотрим, как мы можем сделать то же самое с помощью api фильтра потока java.
Predicatepredicate = new Predicate (){ @Override public boolean test(Integer i) { return (i%2==0); } }; List evenList = intList.parallelStream().filter(predicate).collect(Collectors.toList()); evenCount = evenList.size(); System.out.println("Even Number Count: "+evenCount);
Предикат-это функциональный интерфейс, который принимает один аргумент и возвращает логическое значение на основе тестовой функции. Приведенный выше код также может быть написан, как показано ниже, с использованием лямбда-выражения .
evenCount = intList.parallelStream().filter(i -> { return (i % 2 == 0); }).collect(Collectors.toList()).size();
Пример фильтра потока Java 2
Давайте рассмотрим другой пример, в котором мы хотим отфильтровать список целых чисел и сохранить только числа, превышающие 90.
ListintList = new ArrayList<>(); for(int i=50; i<100; i++) intList.add(i); Stream sequentialStream = myList.stream(); // we can create parallel stream too Stream highNumsStream = sequentialStream.filter(p -> p > 90); //filter numbers greater than 90 System.out.print("High Nums greater than 90="); highNumsStream.forEach(p -> System.out.print(p+" ")); //prints "High Nums greater than 90=91 92 93 94 95 96 97 98 99 "
Пример фильтра потока Java с объектами
Допустим, у нас есть список сотрудников, и мы хотим напечатать имена всех сотрудников в возрасте старше 32 лет. Ниже приведена простая программа для этого с использованием фильтра потока java.
package com.journaldev.examples; import java.util.ArrayList; import java.util.List; public class StreamFilterExample { public static void main(String[] args) { ListempList = new ArrayList<>(); empList.add(new Employee("Pankaj", 35)); empList.add(new Employee("David", 25)); empList.add(new Employee("Lisa", 31)); empList.add(new Employee("Dean", 40)); // print all employees above 32 years of age empList.stream().filter(p -> (p.getAge() > 32)).forEach(p -> System.out.println(p.getName())); } } class Employee { private String name; private int age; public Employee() { } public Employee(String n, int a) { this.name = n; this.age = a; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Вышеприведенная программа выдает результат ниже.
Pankaj Dean
Если мы хотим получить первого сотрудника только в возрасте старше 32 лет, мы можем использовать фильтр с помощью метода findFirst, как показано ниже.
OptionalempO = empList.stream().filter(p -> (p.getAge() > 32)).findFirst(); if(empO.isPresent()) System.out.println(empO.get().getName()+","+empO.get().getAge());
Это все для примеров фильтров потоков java.
Ссылка: Официальная документация Java 8 по потоковому фильтру