过程中
在一个流中进行多次操作,会不会因为之前的操作过滤光了数据而导致后续发生异常?
测试代码
我们直接用代码去测试,可以使用以下代码:
1 | public static void main(String[] args) { |
测试结论
而最终的输出结果会是 Optional.empty ,也就是在操作的过程中无需关心
源码分析
以java.util.ArrayList调用stream()创建的流为样本,查看该类的filter实现,发现核心的逻辑并不复杂,就是根据接口进行验证
1 | //ReferencePipeline.java |
说明一~进行流的传递
new StatelessOp()操作的目的是为了通过将无状态的中间操作附加到现有流中来构造新流。
1 | //ReferencePipeline.java |
说明二~进行数据匹配
1 | //AbstractPipeline |
接受一个Sink,它接受该操作输入类型的元素,并执行该操作,并返回一个Sink。
说明三~实现匹配逻辑
1 | //Sink.java |
包装了一个Sink.ChainedReference并作为Sink的实现,重写了两个方案,begin的重写是为了重置迭代器,accept描述了lambda通过的值就可以添加到Sink中,这个内部类也只是作为默认实现,本身只有空指针的判断处理
在流处理结束后获取会出现什么异常?
处理后
测试代码
1 | // 第一段代码 |
1 | // 第二段代码 |
测试结论
第一段代码:
Exception in thread “main” java.util.NoSuchElementException: No value present
第二段代码:
Exception in thread “main” java.lang.NullPointerException
原因
NoSuchElementException异常
max/min等最终操作会返回两种结果,一是真正的结果,二是通过以下代码返回
1 | // Optional.java |
NoSuchElementException异常就是因为Optional.EMPTY获取操作出现的
NullPointerException
因为null对象在进行逻辑运算的时候很容易出空指针异常,会直接从流操作中跑出来,本文为(int)null >100