Рубрики
Без рубрики

ява.ланг.Фильтр потока Java ArrayIndexOutOfBounds Исключение

Пример фильтра потока Java, фильтр потока Java 8, промежуточная функция фильтра потока Java, карта фильтра потока Java, первый пример с объектами.

Автор оригинала: Pankaj Kumar.

Фильтр потока Java может быть очень полезен, когда вы хотите выполнить некоторую обработку только некоторых элементов потока на основе определенного условия.

Фильтр потока Java

Поток был представлен в Java 8. Фильтр потока Java является промежуточной операцией, т. е. возвращает новый поток.

Пример фильтра потока Java

Давайте рассмотрим простой пример подсчета четных чисел в списке целых чисел. Мы можем сделать это, как показано ниже.

List intList = 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.

Predicate predicate = 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.

List intList = 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) {
		List empList = 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, как показано ниже.

Optional empO = empList.stream().filter(p -> (p.getAge() > 32)).findFirst();

if(empO.isPresent())
	System.out.println(empO.get().getName()+","+empO.get().getAge());

Это все для примеров фильтров потоков java.

Ссылка: Официальная документация Java 8 по потоковому фильтру