java优雅处理npe_Java流上的NPE减少操作
最近,在使用
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减少操作相关推荐
- java优雅关闭io流
教科书关闭的方法是每个都需要判断是否为空,每个都调用close.而且每个都需要在自己的try catch里面调用 如下图 InputStream is=null;InputStreamReader i ...
- Java 8 如何以并发方式在同一个流 上执行多种操作
Java 8 中,流有一个非常大的(也可能是最大的)局限性,使用时,对它操作一次仅能得到一个处理结果.实际操作中,如果你试图多次遍历同一个流,结果只有一个,那就是遭遇下面这样的异常: java.lan ...
- java中io流实现哪个接口_第55节:Java当中的IO流-时间api(下)-上
标题图 Java当中的IO流(下)-上日期和时间日期类:java.util.Date 系统时间:long time = System.currentTimeMillis();public class ...
- Java当中的IO流-时间api(下)-上
Java当中的IO流(下)-上 日期和时间 日期类:java.util.Date 系统时间: long time = System.currentTimeMillis(); public class ...
- java byte char io流_一文带你看懂JAVA IO流,史上最全面的IO教学
原标题:一文带你看懂JAVA IO流,史上最全面的IO教学 一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符 ...
- java中用I/O流实现文件上传
依赖添加 需要添加以下两个依赖 <dependency><groupId>commons-fileupload</groupId><artifactId> ...
- [转载] Java面试题全集(上)
参考链接: 如何运行不同目录中的Java类文件 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...
- 【java笔记】Stream流(1)你知道什么叫Stream流吗?
JDK8 中的 Stream 是对集合(Collection)对象功能的增强,它借助于lambda表达式,更优雅的表达风格,极大的提高编程效率和程序可读性.它针对于对集合对象进行各种非常便利.高效的聚 ...
- 史上最全Java面试题全集(上)
转载自 Java面试题全集(上)!(速度收藏) 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有 ...
最新文章
- 争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记
- 转:读AD里特殊的属性in C#
- WinForm 程序的界面多语言切换
- a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种办法
- [安全相关]其他安全漏洞
- C++中输入一组数字 以换行符结束输入
- Hadoop中RPC机制
- 初识exe程序反汇编小感
- layer弹出层闪退_jQuery使用Layer弹出层插件闪退问题
- 批量获取客户端时间偏差
- 用友t3服务器更改是哪个文件夹里,用友t3服务器地址变更
- atitit.提升研发管理的利器---重型框架 框架 类库的区别
- c语言英美姓名,英美常用人名——C-D
- 同时合并多个视频,并添加转场特效
- 0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded解决方法
- 【原创】聊天机器人与自动问答技术
- access两位小数不进位_文章列表-火龙的博客 - PHP,GO,MySQL知识分享问题记录博客...
- 蓝牙耳机哪个品牌经济实惠?价格便宜音质好的蓝牙耳机推荐
- 银行账户管理系统(一)
- 用字符数组作函数参数编程实现如下功能:在字符串中删除与某字符相同的字符。
热门文章
- IDEA JetBrains Mono 字体安装配置(Windows)
- BZOJ2743: [HEOI2012]采花
- 如何在计算机课堂中培养核心素养,如何在信息技术中培养学生的核心素养
- [Unity]使用Unity2019 中LWRP,可以非常轻松地对被墙壁遮挡的角色进行剪影
- ReactNative全面屏(Android)适配问题
- MFC-创建模态对话框和非模态对话框的方法
- 给小白的礼物,菜鸟学Python入门教程大盘点
- 同步手绘板——android端下笔后颜色变化
- mysql如何显示前50行?
- 用多媒体计算机画图教学设计,用计算机画图教学设计