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

envsm3lx  于 2023-04-19  发布在  Java
关注(0)|答案(4)|浏览(119)

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

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<String> value =

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

知道吗?谢谢

svujldwt

svujldwt1#

List<String> nameList = Arrays.asList("ABC","LMN","XYZ");`

Optional<String> optName1 = Optional.ofNullable(nameList)
            .orElse(Collections.empty list())
            .stream()
            .filter(name->"XYZ123".equals(name))
            .findAny();

if(optName1.isPresent()){
            System.out.println("---->"+optName1.get());
        }
2ekbmq32

2ekbmq322#

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来 Package 它(除非返回值可能是 null -但同样,当返回类型是Collection时,建议不要返回 null)。
a0x5cqrl

a0x5cqrl3#

假设people是Collection,第一次使用Optional是不需要的,你可以这样做,

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

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

2uluyalo

2uluyalo4#

实际上你不需要一个嵌套的lambda来完成这个任务,而是在orElse上返回Collections.emptyList()

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

相关问题