Lambda表达式和Optional如何返回字符串值

5

我希望获取一个 Optional 值,我的代码如下:

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

有什么想法吗?谢谢。
4个回答

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

更好的方法是使用flatmap,而不是在最后返回null(不建议将null赋值给Optional变量)。
Optional.ofNullable(MyObject.getPeople())
    .flatmap(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()));
< p>< em>注意:您的第一条语句也有些奇怪。如果< code> MyObject.getPeople 返回一个集合,则无需使用Optional来包装它(除非返回值可能为 null - 但再次建议在返回类型为集合时不要返回 null )。


1
假设people是一个“Collection”,则第一次使用Optional是不必要的。您可以这样做,
Optional<String> value = MyObject.getPeople().stream()
    .filter(person -> person.getName().equals("test1"))
    .findFirst().map(person -> person.getId());

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

1
实际上,您不需要嵌套的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);

最近,当我需要将optional<stream<string>>映射到纯流以继续调用链时,我想到了同样的想法。这并不太容易... - Pasha

-1
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());
        }
        

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接