首页 > 解决方案 > Lambda 表达式和可选如何返回字符串值

问题描述

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

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

任何想法?谢谢

标签: javalambdacollectionsjava-8java-stream

解决方案


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(不建议分配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 - 但同样,当返回类型为 Collection 时,建议不要返回null )。


推荐阅读