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)
这是非常明确的,不滥用可选,并且不会仅为链式方法创建可选实例.
它们是不同的东西,一个是Object,另一个是运算符。您不应该在它们之间进行比较。第一种方法可以简化为此,这将更易于阅读和描述:
Optional.ofNullable(userName).map(this::createUser).ifPresent(header::setUser);
Run Code Online (Sandbox Code Playgroud)
如果您真的想在它们之间进行比较,那么上面已经提到了唯一的不同。如果在运算符中处理条件或结果更复杂,将导致表达式过于复杂而无法读取。
| 归档时间: |
|
| 查看次数: |
7723 次 |
| 最近记录: |