Lambda表达式和可选的如何返回字符串值

时间:2018-11-07 14:13:52

标签: java lambda collections java-8 java-stream

我想要一个可选值,我有这样的东西:

Optional<String> value =

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

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

有什么主意吗?谢谢

3 个答案:

答案 0 :(得分:6)

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

更好的方法是使用flatmap并且不要在结尾处返回空值(不建议将null分配给Optional变量)

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

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

答案 1 :(得分:1)

假设人员是Collection,则不需要首先使用Optional。您可以这样做,

Optional<String> value = MyObject.getPeople().stream()
    .filter(person -> person.getName().equals("test1"))
    .findFirst().map(person -> person.getId());

如果存在一个值,它将返回它,否则将返回一个空的Optional。

答案 2 :(得分:1)

实际上,您不需要嵌套的lambda。改为在Collections.emptyList()上返回orElse

Optional<String> value = Optional.ofNullable(MyObject.getPeople())
            .orElse(Collections.emptyList())
            .stream()
            .filter(person -> person.getName().equals("test"))
            .findFirst()
            .map(Person::getId);