【发布时间】:2013-06-13 07:00:44
【问题描述】:
我知道这个主题可能有点in advance,因为 JDK8 还没有发布(而且现在还没有..)但我正在阅读一些关于 Lambda 表达式的文章,特别是与新集合 API 相关的部分称为流。
这是Java Magazine article 中给出的示例(它是一种水獭种群算法..):
Set<Otter> otters = getOtters();
System.out.println(otters.stream()
.filter(o -> !o.isWild())
.map(o -> o.getKeeper())
.filter(k -> k.isFemale())
.into(new ArrayList<>())
.size());
我的问题是,如果在 Set 内部迭代过程中,其中一只水獭为空,会发生什么?
我希望抛出 NullPointerException,但也许我仍然停留在以前的开发范式(非功能性)中,有人可以告诉我应该如何处理吗?
如果这真的抛出 NullPointerException,我觉得这个功能很危险,只能按如下方式使用:
- 开发人员确保没有空值(可能使用以前的 .filter(o -> o != null))
- 开发人员确保应用程序永远不会 生成 null otter 或特殊的 NullOtter 对象来处理。
什么是最好的选择,或任何其他选择?
【问题讨论】:
-
我会说程序员在这里做正确的事情; JVM 和编译器只能做这么多。但是请注意,某些集合实现不允许空值。
-
你可以使用
filter(Objects::nonNull)和Objectsfromjava.utils
标签: java null java-8 java-stream