将 for 循环和 if 条件转换为流、过滤、收集

dee*_*pan -1 java filter collect java-stream

我正在尝试将此 for 循环和 if 条件转换为 Java 流、过滤和收集

final List<Optional<String>> students = listofstudents.get();

final List<String> finalist = new ArrayList<>(students.size());

for(int i=0; i<students.size(); i++) {
    if(students.get(i).isPresent()) {
        finalist.add(students.get(i).get());
    }
    else {
        finalist.add(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过这个:

List<String>result = null;

students.stream()
        .filter(e -> e.isPresent())
        .map(e->result.add(e))
        .orElse(result.add(null)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

然而,这是完全错误的。我无法让它按预期工作

有人可以告诉我应该如何使用流、过滤器、收集来做到这一点吗?

Eri*_*ean 5

映射时可以使用三元条件运算符:

List<String> result = students.stream()
                              .map(op -> op.isPresent()? op.get() : null)
                              .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者正如 @Mark Rotteveel 正确评论的那样:

students.stream().map(op -> op.orElse(null)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)