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