使用Stream.ofNullable处理可为空的列表是否是错误的做法

Bre*_*t Y 2 java optional java-stream

正确使用可选内容的第12项不是可选商品状态

有时,我们倾向于“过度使用”事物。这意味着我们拥有诸如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)

And*_*ner 5

我认为“依赖简单代码”的建议在任何地方都是很好的建议,不仅限于OptionalStream.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)

因为您有更大的灵活性可以在循环内执行更多操作(例如,中断),而根本不需要使用流(/类似流的方法)。