根据条件使用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("");