当前位置: 首页 > 知识库问答 >
问题:

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

李俊雅
2023-03-14

我知道这个主题可能有点预先,因为JDK8还没有发布(至少现在还没有)但是我读了一些关于Lambda表达式的文章,特别是与新的集合API(称为Stream)相关的部分。

下面是Java Magazine文章中给出的示例(它是一个otter population Algorithm..):

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());

我的问题是,如果在设置的内部迭代中间,其中一个otter为空,会发生什么?

    null

谢谢!

共有1个答案

黄向明
2023-03-14

当前的思路似乎是“容忍”空值,即在一般情况下允许它们,尽管有些操作的容忍度较低,最终可能会抛出NPE。请参阅Lambda库专家组邮件列表中的空值讨论,特别是这条消息。随后出现了关于备选方案#3的共识(Doug Lea提出了明显的反对意见)。因此,是的,行动计划担心管道爆炸与NPE是有效的。

Tony Hoare将零值称为“十亿美元的错误”并非没有意义。处理空值是一件非常痛苦的事情。即使是经典的集合(不考虑lambda或streams),空值也是有问题的。正如fge在一篇评论中提到的,有些集合允许空值,有些则不允许。对于允许Null的集合,这会在API中引入歧义。例如,对于map.get(),一个null返回表示键存在且其值为null,或者表示键不存在。人们必须做额外的工作来消除这些情况的歧义。

null的通常用法是表示没有值。为Java SE 8提出的处理此问题的方法是引入一个新的Java.util.optional类型,它封装值的存在/不存在,以及提供默认值、抛出异常或调用函数等行为(如果值不存在)。optional仅由新的API使用,但系统中的其他所有内容仍然必须承受空值的可能性。

 类似资料:
  • 问题内容: Java开发人员大家好, 我知道这个主题可能有点,因为JDK8尚未发布(无论如何现在还没有。),但是我正在阅读一些有关Lambda表达式的文章,尤其是与与称为Stream的新集合API相关的部分。 这是《Java杂志》文章中给出的示例(这是一种水獭种群算法。): 我的问题是,如果在Set内部迭代的中间,水獭之一为null,会发生什么情况? 我希望抛出NullPointerExcepti

  • 问题内容: 我想派生一个go进程并获取新进程的ID,但是我在或库中看到的只是启动一个新进程。 问题答案: 您应该从包装中获取。 请注意,这是在根本不使用任何线程的情况下发明的,并且一个进程中始终只有一个执行线程,因此分叉是安全的。使用Go,情况完全不同,因为它大量使用OS级线程来为其goroutine调度提供动力。 现在,在Linux上未经修饰的子进程将在所有活动线程中只有一个线程(在父进程中调用

  • Android开发人员教程建议我使用片段的主机活动来传递数据等等,那么为什么会有一个设置/获取目标片段的方法呢? 到目前为止,我的应用程序包含一个宿主活动和一个片段,其中有一个按钮可以启动一个对话片段,其中有一个按钮可以启动另一个对话片段。使用让整个磨难有些混乱,所以我正在考虑重新实现,让我的主要活动通过我的主要片段的自定义界面处理方法。 这是正确的思维方式吗?还是使用没有害处?任何人都可以提供使

  • 问题内容: 我正在学习MySQL并尝试使用子句。当我如下使用它时: 我收到以下错误: MySQL服务器正在使用–secure-file-priv选项运行,因此它无法执行此语句 我该如何解决这个错误? 我已经检查了关于同一错误消息的另一个问题,但仍然找不到解决方案。 我正在使用MySQL 5.6 问题答案: 它按预期工作。您的MySQL服务器已使用--secure-file- priv 选项启动,该

  • 问题内容: 我想了解如何使用dis(Python字节码的反汇编程序)。具体来说,应该如何解释(或)的输出? 。 这是一个非常具体的示例(在Python 2.7.3中): 我看到等是字节码指令 (尽管有趣的是,它没有出现在此列表中,尽管我希望它可以作为)。我认为右侧的数字是内存分配,而左侧的数字是goto数字…我注意到它们每次 几乎 增加3(但不是完全一样)。 如果我包装一个函数: 问题答案: 您正

  • 我本地是windows环境 线上是linux 两边php版本不一样 一个7.2 一个7.3 本地用的phpstudy 我用composer require 安装了一个包 然后composer.json更新了 提交到服务器去 请问这个时候我在服务器是执行composer.update还是 composer install 呢?网上说不要update 能否有大佬给我说明白下。这个compser.jso