如果存在,则使用 Java Stream 根据条件分配一个值,否则
Assign a value based on condition using Java Stream if present or else
如果存在 Optional,我想将值设置为字符串,否则根据条件从列表中获取它。我尝试了很多方法但无法得到它。我是 Streams 的新手,所以需要帮助。
基本上我的条件是传统方式是这样的-
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(""));
为此你应该使用 Optional#orElseGet
为什么 orElseGet
而不是 orElse
?
因为 orElseGet
接受一个 Supplier
,只有当您的 Optional
为空时才会调用它。所以你不会有 Stream
创建等的开销
例子
String rel = release.orElseGet(() -> project.getReleases()
.stream()
.filter(Release::isActive)
.map(Release::getName)
.findFirst()
.orElse(""));
如果您使用 java-9 或更高版本(我建议您标记使用的版本),这就是您想要的:
String rel = release
.or(() -> project.getReleases().stream()
.filter(Release::isActive)
.map(Release::getName)
.findFirst())
.orElse("");
基本上 Optional#or
returns 原始值 Optional
或提供一个 Supplier<Optional>
以惰性方式提供此类值(如果存在以前的值)。
利用Stream#findFirst
returns Optional
的优势,因此这种调用与方法需要兼容。如果在之前的尝试中没有可用的值,最后调用 orElse("")
作为最后一个可能的值。
如果存在 Optional,我想将值设置为字符串,否则根据条件从列表中获取它。我尝试了很多方法但无法得到它。我是 Streams 的新手,所以需要帮助。
基本上我的条件是传统方式是这样的-
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(""));
为此你应该使用 Optional#orElseGet
为什么 orElseGet
而不是 orElse
?
因为 orElseGet
接受一个 Supplier
,只有当您的 Optional
为空时才会调用它。所以你不会有 Stream
创建等的开销
例子
String rel = release.orElseGet(() -> project.getReleases()
.stream()
.filter(Release::isActive)
.map(Release::getName)
.findFirst()
.orElse(""));
如果您使用 java-9 或更高版本(我建议您标记使用的版本),这就是您想要的:
String rel = release
.or(() -> project.getReleases().stream()
.filter(Release::isActive)
.map(Release::getName)
.findFirst())
.orElse("");
基本上 Optional#or
returns 原始值 Optional
或提供一个 Supplier<Optional>
以惰性方式提供此类值(如果存在以前的值)。
利用Stream#findFirst
returns Optional
的优势,因此这种调用与方法需要兼容。如果在之前的尝试中没有可用的值,最后调用 orElse("")
作为最后一个可能的值。