使用 Optional.ofNullable 作为三元运算符的替代品是一种很好的做法吗?

2022-09-02 19:30:22

请考虑以下表达式的用法:

String hi = Optional.ofNullable(sayHi()).orElse("-");

这实际上对应于这个三元表达式:

String hi = sayHi() != null ? sayHi() : "-";

与方法调用的这种用法是一种很好的做法吗?或者只是额外的冗长编码?Optional.ofNullable


我认识到这实际上创建了一个变量,并避免了两次调用该方法。为了避免这个问题,你实际上可以创建一个额外的变量,但这会增加三元选项的详细程度:Optional.ofNullablesayHi()

String hi = sayHi();
hi = hi != null ? hi : "-";

另一方面,在不成为额外对象的情况下创建。因此,肯定会有更多的开销。Optional.ofNullablehinullOptional

因此,使用这种类型的构造来替换三元构造函数似乎有一些优点和缺点。


顺便说一句:这是Java 8的实现:Optional.ofNullable

public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}

答案 1

在 JDK 9 或更高版本中,请使用以下命令:

String hi = Objects.requireNonNullElse(sayHi(), "-");

这样可以避免在使用三元运算符时必须重复,或者将其值分配给在三元内重用的局部变量。这可能是一个小小的改进。它还回避了是否使用 的问题。:-)sayHi()Optional


答案 2

每当我想到将可选API用于特定目的时,我总是提醒自己它的目的是做什么,以及为什么它被引入JDK,即

可选,旨在为库方法返回类型提供有限的机制,其中明确需要表示“无结果”,并且为此使用null极有可能导致错误 - Stuart Marks

Optional 主要关注可能具有或可能没有返回值的返回类型。

过度使用此构造(如您的这个特定示例中所示)只会导致额外的内存分配和GC开销。

我会让事情变得简单,而是这样做:

String hi = sayHi();
if(hi == null) hi = “-“;
...

推荐