Java 8 ifPresent 与三元运算符

Java 8 ifPresent vs ternary operator

你觉得哪个更好(当然有论据):

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

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

方法 createUser 创建 xml 元素,整个代码和平的目的是根据 userName 的存在在 SOAP 请求中设置它。

我看到的第一种方法的好处是没有无用的操作,代码只做一件事而不做更多。但是第二种方法可以让你多节省一行代码,从而显得更简洁。

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

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

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

IF你真的很想比较它们,唯一不同的是你上面已经提到了。如果您在运算符中处理条件或结果更复杂,这将导致表达式太复杂而难以阅读。

Optional 被设计用作 return 类型,用于不能总是 return 值的方法,例如 getFirstElementOfAList(),它不能 [=27] =] 如果列表为空,则其他任何内容:returning null 将不如 returning 空 Optional 清晰,并且可能意味着第一个元素为 null,而不是没有第一个元素.

设计者不打算将 Optional 用作链接方法的便利结构。参见 the presentation by Stuart Marks(谁在 JDK 上工作),尤其是他在第 28 分钟所说的话:

It's generally a bad idea to create an Optional for the specific purpose of chaining methods [...]

你当然可以不尊重预期的设计和最佳实践,但你的同事也可能因此而讨厌你:-)

请注意,您发布的两个片段做的不是同一件事。如果用户名为 null,第一个不执行任何操作,而第二个将用户设置为 null(这可能会引发异常或覆盖以前的值)

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

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

非常清楚,没有滥用 Optional,也没有创建 Optional 实例来链接方法。