我想要一个可选值,我有这样的东西:
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);
有什么主意吗?谢谢
答案 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);