3、Optional类型到此我们已经了解了流的创建和中间操作 , 但是在学习终结操作之前 , 我们还有一个更重要的问题:健壮性研究 。
在前面的处理环节我们需要考虑 , 如果流中存在一个null
会发生什么呢?要知道流可不是什么快乐通道 , 作为程序员 , 我们必须要考虑周全 , 环环相扣 。
所以为了防止在某些不该出现null
的地方出现了null
导致处理失败 , 我们需要一个类似占位符的存在 , 它既可以作为流元素占位也可以在我们要找的元素不存在时告知我们(即不会抛出异常)
这个想法的实现就是Optional
类型 , 这些类型只会通过某些标准流操作返回 , 因为这些操作不一定能保证所要的结果一定存在:
findFirst()
返回包含第一个元素的Optional
, 若流为空 , 则返回Optional.empty
findAny()
返回包含任何元素的Optional
, 若流为空 , 则返回Optional.empty
max()
和min()
分别返回包含流中最大或最小值的Optional
, 若流为空 , 则返回Optional.empty
reduce()
的其中一个实现 , 参数为一个接收两个参数并返回一个结果的方法引用 , 其作用就是返回各个元素根据该参数计算得到的值 , 其中每次迭代计算出的值会作为下一次计算的第一个参数比如1,2,3,4给出reduce((x1, x2) -> x1+x2)
那么计算流程会是1+2=3, 3+3=6 , 6+4=10average()
可以对数值化的流计算均值并以对应的Optional
类对象返回
Optional
对象了 , 那么有什么用呢?这就要提到便捷函数了便捷函数可以用于获取
Optional
中封装的数据 , 并且简化了步骤ifPresent(Consumer)
:如果值存在 , 则通过该值调用Consumer
函数 , 否则跳过orElse(otherObject)
:如果值存在 , 则返回该对象 , 否则返回参数对象orElseGet(Supplier)
:如果值存在 , 则返回该对象 , 否则返回Supplier
方法创造的对象orElseThrow(Supplier)
:如果值存在 , 则返回该对象 , 否则抛出一个使用Supplier
方法创造的异常
Optional
对象 , 那么我们可以使用这些Optional
类的静态方法:empty()
:返回一个空的Optional
of(value)
:如果已经知道这个value
不是null
, 可以使用该方法把它封装在一个Optional
对象中ofNullable(value)
:如果不能确定封装值是不是null
, 则使用此方法封装
Optional
进行事后处理 , 提供最后一次处理机会filter(Predicate)
map(Function)
flatMap(Function)
Optional
对象中最后 , 回到我们的主角Stream上来 , 有时候 , 我们不是给出的参数含有
null
而是处理的结果可能含有null
那么我们可能会希望将这些返回值包含在
经验总结扩展阅读
- 2022,一个Java程序猿的外设配置
- 2022,一个Java程序猿的装机配置
- Java 多线程写zip文件遇到的错误 write beyond end of stream!
- 1 JAVA语言学习-面向对象
- 函谷关在哪里
- Java 19 新功能介绍
- Java线程未捕获异常处理 UncaughtExceptionHandler
- 死磕面试系列,Java到底是值传递还是引用传递?
- 【Java复健指南09】项目练习全解--房屋出租系统
- Java集合精选常见面试题