使用Optional.ofNullable作为三元运算符的替代是一种好习惯吗?

gil*_*des 10 java nullable optional java-8

考虑这个表达式的用法:

String hi = Optional.ofNullable(sayHi()).orElse("-");
Run Code Online (Sandbox Code Playgroud)

这有效地对应于这个三元表达式:

String hi = sayHi() != null ? sayHi() : "-";
Run Code Online (Sandbox Code Playgroud)

使用Optional.ofNullable方法调用是一种好习惯吗?或者只是额外的详细编码?


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

String hi = sayHi();
hi = hi != null ? hi : "-";
Run Code Online (Sandbox Code Playgroud)

另一方面,Optional.ofNullablehi不是null额外Optional对象的情况下创建.所以肯定会有更多的开销.

因此,使用这种类型的构造来替换三元构造函数似乎有一些利弊.


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

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

Ous*_* D. 13

每当我想到为特定目的使用Optional API时,我总是提醒自己它打算做什么以及为什么它被带入JDK和ie

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

可选主要关注可能有也可能没有返回值的返回类型.

过度使用此构造就像在您的这个特定示例中一样,只会导致额外的内存分配和GC开销.

我会保持简单,而是:

String hi = sayHi();
if(hi == null) hi = “-“;
...
Run Code Online (Sandbox Code Playgroud)

  • 加一引用我的话。:-) 实际上,Brian Goetz 提出了最初的措辞,他和我进行了措辞。 (2认同)

Stu*_*rks 11

在JDK 9或更高版本中,使用此:

String hi = Objects.requireNonNullElse(sayHi(), "-");
Run Code Online (Sandbox Code Playgroud)

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


And*_*lko 6

使用Optional.ofNullable方法调用是一种好习惯吗?

从概念上讲,这是一种不好的做法.基本思想是表示缺少返回值,而不是包装可能存在的所有内容null.我坚决反对这种用法.

或者只是额外的详细编码?

在我看来,这是一次尝试让你的代码更时尚的尝试失败.("看,我们正在使用OptionalJava 8中的全新产品!")

我更喜欢可读性和清晰度而不是简洁性.

这种Optinal用法并未提供清晰度,但提出了一些问题:

为什么要包装变量?
你打算怎么办Optional
它会在下面使用/返回吗?

它也没有简洁:你的第二行甚至更短.

为了避免这个问题,你实际上可以创建一个额外的变量,但这会增加三元选项的详细程度.

您没有创建额外的变量.单行版本可以是:

String hi = (hi = sayHi()) != null ? hi : "-";
Run Code Online (Sandbox Code Playgroud)

虽然,你的两行建议绝对没问题:

String messageContent = sayHi();
String hi = messageContent != null ? messageContent : "-";
Run Code Online (Sandbox Code Playgroud)


Bob*_*ous 5

如果您要允许Optional进入您的工作流程,那么您应该考虑修改sayHi()方法,以便返回Optional<String>哪个会使结果更加优雅:

hi = sayHi().orElse("-");
Run Code Online (Sandbox Code Playgroud)

如果您不想引入Optional您的工作流程(因为它确实创建了一个包含可选值的附加对象),那么您最好坚持使用简单的空检查和三元运算符.

关于Optional(例如增加垃圾收集)的性能成本,您需要分析您的应用程序并确定这是否真的是一个真正的问题.

另外,如果您最感兴趣的String话,请注意Objects.toString(Object, String)如果对象为null,则返回默认值的方法:

hi = Objects.toString(hi, "-");
Run Code Online (Sandbox Code Playgroud)

这比手动编写代码更整洁,更优雅.