Bre*_*t Y 2 java optional java-stream
有时,我们倾向于“过度使用”事物。这意味着我们拥有诸如Optional之类的东西,并且到处都可以看到用例。在Optional的情况下,一种常见的情况是将其方法链接起来以达到获得价值的单一目的。避免这种做法,而是依靠简单明了的代码。
这是真的Stream.ofNullable吗?我应该避免这种情况:
Stream.ofNullable(getHandlers(...))
.flatMap(Collections::stream)
.forEach(handler -> handler.handle(event));
Run Code Online (Sandbox Code Playgroud)
赞成吗?
List<Handler> handlers = getHandlers(...)
if (handlers == null) {
return; // do nothing
}
handlers.forEach(handler -> handler.handle(event));
Run Code Online (Sandbox Code Playgroud)
我认为“依赖简单代码”的建议在任何地方都是很好的建议,不仅限于Optional或Stream.ofNullable。
关于问题的具体选择:我认为很难说一个客观上比另一个更简单直接。Stream.ofNullable更简洁,但是需要您知道它的作用;显式if检查较为冗长,但如果您不熟悉Streams ,则可能更容易理解。
当将新方法引入API时,人们可以说它在某种意义上“更难”,因为不熟悉API方法的人会发现它很难阅读,因为他们不知道该方法的作用。当然,可以反驳他们应该知道的事情,或者应该期望遇到他们不知道的事情。
因此,我基本上是说,您应该使用您/您的代码阅读者会最习惯的一种。
但是,我认为这里的坏习惯是getHandlers(...)首先返回null。在有效Java中,有一个项目(第3版中的项目54,第2版中的43)总是返回一个空列表而不是null。
该建议在这里非常有效,因为您以与处理空列表相同的方式来处理空列表。
这样做可以使您编写:
List<Handler> handlers = getHandlers(...);
handlers.stream().forEach(...);
Run Code Online (Sandbox Code Playgroud)
这是客观上比较简单的代码。
我认为使用它会更好:
for (Handler h : getHandlers(...)) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
因为您有更大的灵活性可以在循环内执行更多操作(例如,中断),而根本不需要使用流(/类似流的方法)。