如何处理Java Streams API中的Optional Object?

时间:2018-10-30 10:01:22

标签: java java-stream

我正在做简单的测试。

@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= ....

2 个答案:

答案 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操作。