我们应该如何管理jdk8流中的空值

元素:

Java开发人员大家好,

我知道这个话题可能有点,in advance因为JDK8尚未发布(无论如何现在还没有。),但是我正在阅读一些有关Lambda表达式的文章,尤其是与与称为Stream的新集合API相关的部分。

这是《Java杂志》文章中给出的示例(这是一种水獭种群算法。):

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内部迭代的中间,水獭之一为null,会发生什么情况?

我希望抛出NullPointerException,但也许我仍然停留在以前的开发范例(非功能性)中,有人可以启发我如何处理此问题吗?

如果确实抛出了NullPointerException,我认为该功能非常危险,必须仅按以下方式使用:

  • 开发人员确保没有null值(也许使用以前的.filter(o-> o!= null))
  • 开发人员确保应用程序永远不会生成空水獭或特殊的NullOtter对象来处理。

最佳选择是什么,或其他任何选择?

谢谢!

斯图尔特·马克斯(Stuart Marks):

当前的想法似乎是“容忍”空值,也就是说,通常允许它们,尽管某些操作的容忍度较低,并且最终可能会抛出NPE。请参阅Lambda Libraries专家组邮件列表中有关null讨论,尤其是此消息随后出现了关于选项3的共识(道格·利阿提出了明显反对)。因此,是的,OP对NPE炸毁管道的担忧是正确的。

托尼·霍尔将空值称为“十亿美元的错误”并非毫无道理处理null是一个真正的痛苦。即使使用经典集合(不考虑lambda或流),也存在null问题。正如fge在评论中提到的那样,某些集合允许使用null,而另一些则不允许。对于允许空值的集合,这会在API中引入歧义。例如,对于Map.get(),返回null表示该键存在并且其值为null或该键不存在。必须做出额外的工作来消除这些情况的歧义。

null的通常用法是表示不存在值。针对Java SE 8提出的解决此问题的方法是引入一种新java.util.Optional类型,该类型封装了值的存在/不存在以及提供默认值,抛出异常或调用函数等行为(如果有的话)。该值不存在。Optional只能由新的API使用,但是,系统中的所有其他内容仍然必须忍受null的可能性。

我的建议是尽可能避免实际的空引用。从给出的示例很难看出如何存在“空”水獭。但是,如果有必要,OP提出的过滤掉空值或将它们映射到哨兵对象(Null Object Pattern)的建议是很好的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我们需要在Java 8来检查流是否为空,而不是迭代

我们如何使用java流将currentElement的值与先前的值合并

如果我们更改字符串值,字符串池如何管理引用?

Spring 5 Web Reactive-我们如何使用WebClient检索Flux中的流数据?

我们应该如何使用android 4.4中添加的mipmap文件夹?

我们可以通过Java8中的流将值赋给对象中的变量吗?

我们应该如何使用pad_sequences在keras中填充文本序列?

为什么我们不能在Java 8流中抛出异常?

我们应该使用Option还是ptr :: null来表示Rust中的空指针?

我们如何从结构化流中获得最小批量时间

我们如何对AWS CDK代码进行单元测试?我们应该吗?

我们如何在wso2 esb流中存储元素值?使用属性调解器,我们是否可以存储多个值?

我们如何在角度8中添加链接?

我们如何在Spark结构化流中管理偏移量?(_spark_metadata问题)

我们应该如何选择磁盘帧中的块大小?

我们如何管理多个用户...。在cacheManager中

我们应该如何从Scala / Play将日期时间存储在OrientDB中?

我们如何在Swift中评估bool值?

我们如何规定iOS 8中的应用方向?

我们如何在NSMutableDictionary中存储浮动值

我们可以根据JDK 8中的“特定时间”轮换GC日志吗?

我们如何区分deflateRaw流和deflateRaw流?

Java 8:我们可以使用 map 在流中创建实例方法 ref 吗?

我们应该如何使用微服务构建我们的模型?

我们在python中预处理文本后如何删除空值

我们如何创建一个我们应该实现的对象的“骨架类型”?

我们如何检查数组中的值是否为空(无)?

点击 ListView 中的图片,我们应该得到特定 Row 的属性值

我们如何使 AWS Flow Workflow 代码中的 SWF 工作流执行失败