Java Stream过滤器

时间:2020-02-23 14:36:53  来源:igfitidea点击:

当您希望仅基于特定条件对Stream的某些元素进行某些处理时,Java Stream过滤器可能会非常有用。

Java Stream过滤器

Stream是Java 8中引入的。
JavaStream过滤器是一个中间操作,即它返回一个新的Stream。

Java Stream过滤器示例

让我们看一个简单的示例,计算整数列表中的偶数。
我们可以像下面这样。

List<Integer> 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);

现在,让我们看看如何使用java流过滤器api来做同样的事情。

Predicate<Integer> predicate = new Predicate<Integer>(){

	@Override
	public boolean test(Integer i) {
		return (i%2==0);
	}
	
};
List<Integer> evenList = intList.parallelStream().filter(predicate).collect(Collectors.toList());
evenCount = evenList.size();
System.out.println("Even Number Count: "+evenCount);

谓词是一个功能接口,它接受一个参数并根据测试函数返回布尔值。
上面的代码也可以使用lambda表达式如下编写。

evenCount = intList.parallelStream().filter(i -> {
	return (i % 2 == 0);
}).collect(Collectors.toList()).size();

Java流过滤器示例2

让我们看另一个示例,我们要过滤一个整数列表,只保留大于90的数字。

List<Integer> intList = new ArrayList<>();
for(int i=50; i<100; i++) intList.add(i);

Stream<Integer> sequentialStream = myList.stream(); //we can create parallel stream too

Stream<Integer> 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.theitroad.examples;

import java.util.ArrayList;
import java.util.List;

public class StreamFilterExample {

	public static void main(String[] args) {
		List<Employee> empList = new ArrayList<>();
		empList.add(new Employee("hyman", 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;
	}
}

上面的程序产生下面的输出。

hyman
Dean

如果我们只想获取年龄在32岁以上的第一位员工,则可以将filter与findFirst方法结合使用,如下所示。

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

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