【问题标题】:How to use orElse when you need to invoke a method on the result?当需要对结果调用方法时,如何使用 orElse?
【发布时间】:2016-04-19 15:05:11
【问题描述】:

我有以下代码。我试图找到一种方法来避免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;
    }
}

【问题讨论】:

    标签: java java-stream optional


    【解决方案1】:

    您可以在您的值仍为Optional 形式时使用map 调用该方法:

    public String getFourOrNull() {
        return somethings.stream()
                .filter(s -> s.getIt().equals("four"))
                .findAny()
                .map(Something::getIt)
                .orElse(null);
    }
    

    来自mapsdocumentation

    如果存在值,则对其应用提供的映射函数,如果结果为非 null,则返回描述结果的 Optional。否则返回一个空的 Optional。

    也就是说,如果可以的话,请听 @Aaron 并删除 orElse,以便 getFourOrNull 返回 Optional。在使用Optional 的代码库中,任何方法都不应该返回null

    【讨论】:

    • 太棒了!我以为 map 会获得 NPE,但我猜他们也考虑过这个:)
    【解决方案2】:

    我认为您应该将方法的签名更改为 Optional&lt;String&gt; 并始终返回 something

    Optional 是为这种情况而设计的:它们可以避免返回一些非特定的值(可能是 null""-1),并且相当清楚地描述从您的签名,也许您将能够返回某种类型,但并非总是如此。

    【讨论】:

    • 我知道。不幸的是,在这种情况下我不能返回一个可选的。使用它的人需要 null。
    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多