Java 8 ifPresent vs三元运算符

时间:2017-04-29 13:50:53

标签: java java-8 optional ternary-operator

你认为什么更好(当然有论据):

Optional.ofNullable( userName )
      .ifPresent( nonNullUserName  -> header.setUser( createUser( nonNullUserName ) ) );

header.setUser( userName == null ? createUser( userName ) : null );

方法createUser创建xml元素,整个代码安静的意图是根据userName的存在将其设置在SOAP请求中。

我看到的第一种方法的好处是没有无用的操作,代码做了一件事,没有更多。但是第二种方法可以让你再保存一行代码,因此看起来更简洁。

更新:我想我错过了一个我实际暗示的事情,这引起了一些误解。如果你有一些解释,最好提供更清晰的例子。

2 个答案:

答案 0 :(得分:13)

可选被设计用作不能总是返回值的方法的返回类型,例如getFirstElementOfAList(),如果列表为空则不能返回任何其他内容:返回null将是比返回一个空的Optional更清楚,并且可能意味着第一个元素为null,而不是没有第一个元素。

设计者并不打算将Optional用作连锁方法的便利构造。请参阅the presentation by Stuart Marks(谁在JDK上工作),尤其是他在第28分钟所说的内容:

  

为链接方法[...]

的特定目的创建一个Optional通常是个坏主意

您当然可以自由地不尊重预期的设计和最佳做法,但您的同事可能也可以自由地讨厌您: - )

请注意,您发布的两个代码段不会做同样的事情。如果用户名为null,则第一个不执行任何操作,而第二个将用户设置为null(这可能反过来抛出异常或覆盖先前的值)

我会使用(假设您想要的是第一个版本):

if (userName != null) { 
    header.setUser(createUser(userName)); 
}

非常清楚,不滥用可选,并且不会仅为链式方法创建可选实例。

答案 1 :(得分:4)

它们是不同的东西,一个是Object,另一个是运算符。你不应该在它们之间进行比较。第一种方法可以简化为此,这将更加可读&的 descriablable

Optional.ofNullable(userName).map(this::createUser).ifPresent(header::setUser);

IF 你真的想在它们之间进行比较,唯一不同的是你上面提到的。如果你处理条件或结果更复杂的操作符将导致表达式太复杂而无法读取。