最近,在使用

Java 8流时,我在使用以下测试用例时遇到了对reduce操作的NullPointerException:

private static final BinaryOperator sum = (a, b) -> {

if (a == null) return b;

if (b == null) return a;

return Integer.sum(a, b);

};

List s = new ArrayList<>();

s.add(null);

s.add(null);

s.add(null);

Integer i = s.stream().reduce(sum).orElse(null);

// throws NPE

Integer i = s.stream().reduce(sum).orElse(2);

// throws NPE

Integer i = s.stream().reduce(null,(a, b)->null);

// returns a value i.e null

或者:

Integer i = s.stream().filter(Objects::nonNull).reduce(Integer::sum).orElse(null);

// returns a value i.e null

检查reduce操作后,我遇到了执行reduce操作的类:

class ReducingSink implements AccumulatingSink, ReducingSink> {

private boolean empty;

private T state;

public void begin(long size) {

empty = true;

state = null;

}

@Override

public void accept(T t) {

if (empty) {

empty = false;

state = t;

} else {

state = operator.apply(state, t);

}

}

@Override

public Optional get() {

return empty ? Optional.empty() : Optional.of(state);

}

@Override

public void combine(ReducingSink other) {

if (!other.empty)

accept(other.state);

}

}

在上面的代码中,您看到如果boolean empty为false,则get()方法返回一个可选值,在我的情况下,该值为false但state为null,因此Optional.of(null)抛出NullPointerException.在我的情况下,我有一个允许null的二元运算符.

所以我认为代码

return empty ? Optional.empty() : Optional.of(state);

应改为

return empty || state == null ? Optional.empty() : Optional.of(state);

作为我的二元运算符(具有减少的任务)并且可以使用null.

java优雅处理npe_Java流上的NPE减少操作相关推荐

  1. java优雅关闭io流

    教科书关闭的方法是每个都需要判断是否为空,每个都调用close.而且每个都需要在自己的try catch里面调用 如下图 InputStream is=null;InputStreamReader i ...

  2. Java 8 如何以并发方式在同一个流 上执行多种操作

    Java 8 中,流有一个非常大的(也可能是最大的)局限性,使用时,对它操作一次仅能得到一个处理结果.实际操作中,如果你试图多次遍历同一个流,结果只有一个,那就是遭遇下面这样的异常: java.lan ...

  3. java中io流实现哪个接口_第55节:Java当中的IO流-时间api(下)-上

    标题图 Java当中的IO流(下)-上日期和时间日期类:java.util.Date 系统时间:long time = System.currentTimeMillis();public class  ...

  4. Java当中的IO流-时间api(下)-上

    Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...

  5. java byte char io流_一文带你看懂JAVA IO流,史上最全面的IO教学

    原标题:一文带你看懂JAVA IO流,史上最全面的IO教学 一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符 ...

  6. java中用I/O流实现文件上传

    依赖添加 需要添加以下两个依赖 <dependency><groupId>commons-fileupload</groupId><artifactId> ...

  7. [转载] Java面试题全集(上)

    参考链接: 如何运行不同目录中的Java类文件 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...

  8. 【java笔记】Stream流(1)你知道什么叫Stream流吗?

    JDK8 中的 Stream 是对集合(Collection)对象功能的增强,它借助于lambda表达式,更优雅的表达风格,极大的提高编程效率和程序可读性.它针对于对集合对象进行各种非常便利.高效的聚 ...

  9. 史上最全Java面试题全集(上)

    转载自 Java面试题全集(上)!(速度收藏) 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...

最新文章

  1. 争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记
  2. 转:读AD里特殊的属性in C#
  3. WinForm 程序的界面多语言切换
  4. a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法
  5. [安全相关]其他安全漏洞
  6. C++中输入一组数字 以换行符结束输入
  7. Hadoop中RPC机制
  8. 初识exe程序反汇编小感
  9. layer弹出层闪退_jQuery使用Layer弹出层插件闪退问题
  10. 批量获取客户端时间偏差
  11. 用友t3服务器更改是哪个文件夹里,用友t3服务器地址变更
  12. atitit.提升研发管理的利器---重型框架 框架 类库的区别
  13. c语言英美姓名,英美常用人名——C-D
  14. 同时合并多个视频,并添加转场特效
  15. 0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded解决方法
  16. 【原创】聊天机器人与自动问答技术
  17. access两位小数不进位_文章列表-火龙的博客 - PHP,GO,MySQL知识分享问题记录博客...
  18. 蓝牙耳机哪个品牌经济实惠?价格便宜音质好的蓝牙耳机推荐
  19. 银行账户管理系统(一)
  20. 用字符数组作函数参数编程实现如下功能:在字符串中删除与某字符相同的字符。

热门文章

  1. IDEA JetBrains Mono 字体安装配置(Windows)
  2. BZOJ2743: [HEOI2012]采花
  3. 如何在计算机课堂中培养核心素养,如何在信息技术中培养学生的核心素养
  4. [Unity]使用Unity2019 中LWRP,可以非常轻松地对被墙壁遮挡的角色进行剪影
  5. ReactNative全面屏(Android)适配问题
  6. MFC-创建模态对话框和非模态对话框的方法
  7. 给小白的礼物,菜鸟学Python入门教程大盘点
  8. 同步手绘板——android端下笔后颜色变化
  9. mysql如何显示前50行?
  10. 用多媒体计算机画图教学设计,用计算机画图教学设计