我正在做简单的测试。
@Test
public void whenFilterEmployees_thenGetFilteredEmployees(){
Integer[] empIds = {1,2,3};
List<Optional<Employee>> employees = Stream.of(empIds)
.map(employeeRepository::findById)
.collect(Collectors.toList());
List<Employee> employeeList = employees
.stream().filter(Optional::isPresent)
.map(Optional::get)
.filter(e->e !=null)
.filter(e->e.getSalary()>200000)
.collect(Collectors.toList());
assertEquals(Arrays.asList(arrayOfEmps[2]), employeeList);
}
并且我的雇员表包含数据:
1 Jeff Bezos 100000
2 Bill Gates 200000
3 Mark Zuckerberg 300000
当前测试成功运行。
如您所见,我已经准备了两个雇员列表,即employee和employeeList
我这样做是因为findById
方法返回Optional。我如何使用流api,以便我可以像
List<Employee> employeeList= ....
答案 0 :(得分:4)
只需合并两个流管道,即
List<Employee> employees = Stream.of(empIds)
.map(employeeRepository::findById)
.filter(Optional::isPresent)
.map(Optional::get)
//.filter(e->e !=null) not needed as it's redundant
.filter(e->e.getSalary()>200000)
.collect(Collectors.toList());
答案 1 :(得分:4)
我们可以使用Optional.stream
(需要Java 9+)来简化代码:
List<Employee> employees = Stream.of(empIds)
.flatMap(id -> employeeRepository.findById(id).stream())
.filter(e -> e.getSalary() > 200000)
.collect(Collectors.toList());
根据JavaDoc Optional.stream
返回仅包含该值的顺序
Stream
,否则返回 返回空的Stream
。
因此,我们可以立即进行filter
操作。