Lambda表达式和Optional如何返回String值

Dav*_*vid 4 java collections lambda java-8 java-stream

我想获得一个Optional值,我有这样的东西:

Optional<String> value =

Optional.ofNullable(MyObject.getPeople())
    .ifPresent(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()));
Run Code Online (Sandbox Code Playgroud)

person.getId()应该返回一个字符串,我试过这个但它不起作用,得到不兼容的类型:void无法转换为java.util.Optional

Optional<String> value =

Optional.ofNullable(MyObject.getPeople())
    .ifPresent(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()))
        .orElse(null);
Run Code Online (Sandbox Code Playgroud)

任何的想法?谢谢

use*_*er7 7

Optional.ifPresent需要Consumer- 所以你不能从中返回任何东西.使用Optional.map.

Optional.ofNullable(MyObject.getPeople())
    .map(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()))
    .orElse(null);
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用flatmap而不是在结尾返回null(不建议分配null给Optional变量)

Optional.ofNullable(MyObject.getPeople())
    .flatmap(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()));
Run Code Online (Sandbox Code Playgroud)

注意:你的第一个陈述也有点奇怪.如果MyObject.getPeople返回一个集合,则不需要用Optional包装它(除非返回值可以为null - 但同样,建议在返回类型为Collection时不返回null).