猿问

使用 Stream.ofNullable 处理可空列表是不好的做法吗

this using optionals correctly 中的第 12 项不是可选文章状态

有时,我们倾向于“过度使用”东西。这意味着我们有一个东西,比如 Optional,我们到处都能看到它的用例。在 Optional 的情况下,一个常见的场景涉及链接其方法以获得值的单一目的。避免这种做法并依赖简单明了的代码。


也是一样吗Stream.ofNullable?我应该避免这种情况吗:


Stream.ofNullable(getHandlers(...))

   .flatMap(Collections::stream)

   .forEach(handler -> handler.handle(event));

赞成这个?


List<Handler> handlers = getHandlers(...) 


if (handlers == null) {

    return; // do nothing

}


handlers.forEach(handler -> handler.handle(event));


精慕HU
浏览 167回答 1
1回答

温温酱

我认为“依靠简单明了的代码”的建议在任何地方都是很好的建议,不限于 eitherOptional或Stream.ofNullable.就题中的具体选择而言:我觉得很难说一个客观上比另一个更简单直白。Stream.ofNullable更简洁,但需要您知道它的作用;显式检查更冗长,但如果您不熟悉s,if可能更容易理解。Stream当向 API 引入新方法时,可以说它在某种意义上“更难”,因为不熟悉 API 方法的人会发现它更难阅读,因为他们不知道该方法的作用。当然,人们可以反驳说他们应该知道,或者应该预料到会遇到他们不知道的事情。所以,我基本上是说你应该使用你/你的代码的读者会觉得最舒服的那个。但是,我认为这里不好的做法是getHandlers(...)首先返回 null 。Effective Java中有一项(第 3 版第 54 项,第 2 版第 43 项)关于总是返回一个空列表而不是 null。此建议在这里非常有效,因为您处理空列表的方式与处理空列表的方式相同。这样做可以让你写:List<Handler>&nbsp;handlers&nbsp;=&nbsp;getHandlers(...); handlers.stream().forEach(...);这是客观上更简单的代码。我认为使用它会更好:for&nbsp;(Handler&nbsp;h&nbsp;:&nbsp;getHandlers(...))&nbsp;{ &nbsp;&nbsp;//&nbsp;... &nbsp;&nbsp;}因为您可以更灵活地在循环内做更多事情(例如中断),而无需使用流(/类似流的方法)。
随时随地看视频慕课网APP

相关分类

Java
我要回答