根据条件使用Java流(如果存在)分配值,否则
如果存在可选项,我想将值设置为字符串,否则根据条件从列表中获取该值。我试过很多方法,但都没有成功。我是新手,所以需要帮助 基本上我的情况是传统的-根据条件使用Java流(如果存在)分配值,否则,java,lambda,java-stream,optional,java-9,Java,Lambda,Java Stream,Optional,Java 9,如果存在可选项,我想将值设置为字符串,否则根据条件从列表中获取该值。我试过很多方法,但都没有成功。我是新手,所以需要帮助 基本上我的情况是传统的- String rel = "" if(release.isPresent()){ rel = release.get(); } else{ for(Release r: project.getReleases()){
String rel = ""
if(release.isPresent()){
rel = release.get();
}
else{
for(Release r: project.getReleases()){
if(r.isActive() == true){
rel = r.getName();
}
}
}
这是我写的,但不起作用。我在orElse部分出错了-
rel = release.ifPresent(r-> release.get())
.orElse(
project.getReleases()
.stream()
.filter( r -> r.isActive() == true)
.findFirst()
.map(r->r.getName()));
你能建议一下正确的方法吗?提前感谢您的帮助。您可以这样做
release.orElse(project.getReleases()
.stream().filter(Release::isActive).findFirst().map(Release::getName).orElse(""));
对此,您应该使用
可选的#orElseGet
为什么orElseGet
而不是orElse
?
因为orElseGet
接受一个Supplier
,只有当您的Optional
为空时才会调用该供应商。因此,您将不会有流
创建等开销
例子
String rel=release.orElseGet(()->project.getReleases()
.stream()
.filter(发布::isActive)
.map(发布::getName)
.findFirst()
.orElse(“”);
这是您在使用或更新版本时所需的(我建议您标记使用的版本):
基本上,Optional#或
返回原始Optional
的当前值,或提供一个以惰性方式提供该值的供应商
(如果前一个值存在,则不会调用)
利用
Stream#findFirst
返回Optional
的优点,这样的调用与方法需要兼容。如果在以前的尝试中没有可用的值,最后调用orElse(“”)
作为最后一个可能的值。r->r.isActive()==true
r->r.isActive=>Release::isActive
Hi@Deadpool,当字符串释放有值时它工作正常,但当它没有值时它打印空字符串project.getReleases().stream().filter(Release::isActive).findFirst().map(Release::getName).orElse(“”
part单独工作很好,但是当字符串版本没有值时,整个工作就不起作用了。它打印为空。只是澄清一下,第一个版本是来自配置的值。如果config中的值为空,则应该从project.getReleases()列表中获取该值。-<代码>@Value(“${release.name}”)私有字符串释放代码>这太完美了,非常感谢!这也行得通,看起来有多种方法或者(),orElse(),orElseGet()。找到Nikolas真是太好了@sana:我不建议将流放入orElse()中,因为无论是否需要结果,每次都会调用它。
String rel = release
.or(() -> project.getReleases().stream()
.filter(Release::isActive)
.map(Release::getName)
.findFirst())
.orElse("");