我有以下代码打击。我试图找到一种方法来避开if (something.isPresent())
行并声明Optional<Something> something
。相反,我想链接Optional.orElse()
方法并直接返回结果。但是我似乎无法找到一种方法,因为如果找不到该元素,该方法需要返回null,如果找到它,则需要在返回之前调用其上的方法。
有更好的方法吗?
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OrElseWhat {
private class Something {
private String it;
Something(String it) { this.it = it; }
String getIt() { return it; }
}
private List<Something> somethings = new ArrayList<Something>() {
{
add(new Something("one"));
add(new Something("two"));
add(new Something("three"));
}
};
public String getFourOrNull() {
Optional<Something> something = somethings.stream()
.filter(s -> s.getIt().equals("four"))
.findAny();
if (something.isPresent()) {
return something.get().getIt();
}
return null;
}
}
答案 0 :(得分:3)
您可以使用Optional
在map
表单中使用public String getFourOrNull() {
return somethings.stream()
.filter(s -> s.getIt().equals("four"))
.findAny()
.map(Something::getIt)
.orElse(null);
}
时调用该方法:
maps
来自orElse
&#39; s documentation:
如果存在值,则将提供的映射函数应用于该值,如果结果为非null,则返回描述结果的Optional。否则返回一个空的Optional。
尽管如此,如果可以,请听@Aaron并放弃getFourOrNull
,以便Optional
返回null
。任何方法都不应该在使用Optional
的代码库中返回return super.onCreateOptionsMenu(menu);
。
答案 1 :(得分:2)
我认为您应该将方法的签名更改为Optional<String>
并始终返回something
。
Optional
是针对这种情况制作的:它们可以避免返回一些非特定值(可能是null
?或""
?或{ {1}})并且相当清楚地描述从你的签名开始,也许你能够返回某种类型,但并非总是如此。