如果存在,则使用 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(""));

如果您使用 或更高版本(我建议您标记使用的版本),这就是您想要的:

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("") 作为最后一个可能的值。