Java 8 ifPresent vs三元运算符

Dmi*_*ich 2 java ternary-operator optional java-8

你觉得什么更好(当然有论据):

Optional.ofNullable( userName )
      .ifPresent( nonNullUserName  -> header.setUser( createUser( nonNullUserName ) ) );
Run Code Online (Sandbox Code Playgroud)

要么

header.setUser( userName == null ? createUser( userName ) : null );
Run Code Online (Sandbox Code Playgroud)

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

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

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

JB *_*zet 14

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

设计者并不打算将Optional用作链式方法的便利构造.请参阅Stuart Marks(他在JDK上工作)的演讲,特别是他在第28分钟所说的内容:

为链接方法的特定目的创建一个Optional通常是一个坏主意[...]

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

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

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

if (userName != null) { 
    header.setUser(createUser(userName)); 
}
Run Code Online (Sandbox Code Playgroud)

这是非常明确的,不滥用可选,并且不会仅为链式方法创建可选实例.

  • 除了JDK团队的意图之外,是否有任何有效,科学或至少是经验性的论据来*不*使用`Optional`来链接方法(如@ holi-java的答案)?因为,我本来打算成为摇滚明星,但最终还是用Java编程... (2认同)
  • @FedericoPeraltaSchaffner正如引用甲骨文的那个人所说的那样,这不是"甲骨文的某个人说不这样做你不应该这样做." 相反,它是关于设计意图和有效性.如果某些东西是出于某种目的而设计的,那么它可能对此有用.它不太可能*用于未设计的目的.特别是,`Optional`不是为了替换if语句而设计的.在这种情况下,使用"Optional"的替代方案可能非常清晰.(我不是这么认为的,但合理的人可以对此持不同意见.) (2认同)

hol*_*ava 5

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

Optional.ofNullable(userName).map(this::createUser).ifPresent(header::setUser);
Run Code Online (Sandbox Code Playgroud)

如果您真的想在它们之间进行比较,那么上面已经提到了唯一的不同。如果在运算符中处理条件或结果更复杂,将导致表达式过于复杂而无法读取。