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());

