【精通函数式编程】(九) Optional实战大全

简介: 本讲了解null的缺陷,了解为什么用Optional 取代null,学习Optional 的必要性,代码里怎么用Optional 才能更优雅

前言📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫

🏆 Java领域优质创作者、阿里云专家博主、华为云专家🏆

🔥 如果此文还不错的话,还请👍关注点赞收藏三连支持👍一下博主哦

导读

本讲了解null的缺陷,了解为什么用 Optional 取代null,学习Optional 的必要性,代码里怎么用Optional 才能更优雅

一、用 Optional 取代null

用 Optional 取代null总要有原因的,我们先看看null的缺陷,了解为什么用 Optional 取代null,代码里怎么用Optional 才能更优雅

1、为什么用 Optional 取代null

null的缺陷本身会造成很严重的问题,我们熟知的NullPointerException是目前Java以及其他语言最典型的异常,当然我们可以避免,就是在每个对象使用的时候判空,例如 if(null != object) ,虽然可以避免NullPointerException,但是代码想膏药一样去不掉,可读性很差,代码里充斥大量判空处理

null本身是没有意义的,我们一般接口返回会有 respMsg、respCode、result等等,返回null代表出现了错误,是需要进行异常处理的

null破坏了Java的设计原理,在Java中屏蔽了底层的指针操作,但是唯一例外的就是空指针异常

网络异常,图片无法展示
|

2、 使用Optional 优雅的解决null

Java吸取了Scala等语言,在Java8中引入了 java.util.Optional,该类封装了Optional类型的值,可以接收泛型类型的值,可以理解为,将 所需要的对象包在 Optional对象中,变量存在时,Optional只是封装所需对象,不存在时,缺失的值会被构建成一个空的Optional对象,这个对象有Optional.empty() 方法返回

Optional.empty() 方法是一个静态工程,它会返回一个Optional类的特定单一实例,如果你尝试解析一个空对象一定会报一个NullPointerException,但是使用Optional.empty() 方法,是解析一个有效的Optional对象,不对是你所需的对象是空的

网络异常,图片无法展示
|

在你的代码中建议使用Optional对象接收对象,这样不需要进行判空等操作,可以清晰的判断数据问题还是某些设计问题,引入Optional对象也不是消除所有的null,而是更好的管理对象

创建Optional对象有几种形式:

public static void main(String[] args) {
    // 创建一个空的 Optional对象,但是这个对象并不会报java.lang.NullPointerException
    Optional<OrderInfo> o = Optional.empty();
    // 根据一个非空值创建 Optional对象
    OrderInfo orderInfo = new OrderInfo();
    Optional<OrderInfo> o1 = Optional.of(orderInfo);
    // 根据一个可以是空 Optional对象
    orderInfo = null;
    Optional<OrderInfo> o2 = Optional.ofNullable(orderInfo);
}

创建出来的Optional对象,有什么Java提供的API,我们如何从Optional对象中提取我们需要的值,如何使用Optional对象构成Stream流呢

public static void main(String[] args) {
    // 使用map提取Optional对象中的值,map不可以连用
    Optional<String> o3 = Optional.ofNullable(orderInfo).map(OrderInfo::getOrderId);
    // flatMap方法:接受一个返回值为Optional的映射函数参数,该返回值亦是flatMap方法的返回值若结果为空,则返回 空Optional。
    Optional<List<SubOrderInfo>> subOrderInfos = Optional.ofNullable(orderInfo)
            .flatMap(orderInfo1 -> Optional.ofNullable(orderInfo1.getSubOrderInfoList()));
    // 获取子单的id,将Stream<Optional<String>> 转化为 Stream<String>
    List<OrderInfo> orderInfos = Arrays.asList();
    List<String> subOdrIdList = orderInfos.stream()
            .map(OrderInfo::getSubOrderInfoList)
            .flatMap(sub -> sub.stream())
            .map(SubOrderInfo::getSubOrderIdOp)
            .flatMap(Optional::stream)
            .collect(Collectors.toList());
}
// 用 Optional封装对象
public Optional<String> getSubOrderIdOp() {
    return Optional.ofNullable(subOrderIdOp);
}

二、Optional API大全

empty 返回一个空的 Optional 实例

filter如果值存在并且满足提供的谓词(条件),就返回包含该值的 Optional 对象,否则返回一个空的Optional对象

flatMap、map如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返回一个空的Optional对象。map,如果值存在,就对该值执行提供的 mapping 函数调用

get如果值存在,就将该值用 optional 封装返回,否则抛出一个 NoSuchElement Exception异常

ifPresentOrElse、isPresent如果值存在,就以值作为输人执行对应的方法调用,否则执行另一个不需任何输人的方法。isPresent,如果值存在就返回 true,否则返回 talse

of、ofNullableof将指定值川optiona1封装之后返回,如果该值为null,则抛出一个NullPointerException异常,ofNullable将指定值用 Optional封装之后返回,如果该值为null,则返回一个空的optional对象

or、orElse 、orElseGet 、orElseThrow or 如果值存在,就返回同一个optional对象,否则返回由支持函数生成的另一个optional对象。orElse 如果有值则将其返回,否则返回一个默认值。orElseGet 如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值。orElseThrow 如果有值则将其返回,否则抛出一个由指定的 Supplier接口生成的异常

stream 如果有值,就返回包含该值的一个Stream,否则返回一个空的 Stream

相关文章
|
3月前
|
消息中间件 分布式计算 大数据
Scala学习--day03--函数式编程
Scala学习--day03--函数式编程
|
3月前
|
存储 Python
介绍Python中的函数式编程工具,如`map`、`filter`和`reduce`。
介绍Python中的函数式编程工具,如`map`、`filter`和`reduce`。
|
6月前
|
Python
Python的函数式编程指南:Lambda、Map和Filter的应用
Python是一门多范式的编程语言,允许你以不同的方式编写代码,包括面向对象编程、过程式编程和函数式编程。函数式编程是一种强大的编程范式,它强调不可变性、纯函数和高阶函数的使用。本文将引导你了解Python中函数式编程的一些核心概念和技巧,特别是Lambda、Map和Filter的应用。
|
并行计算 安全 Java
SpringCloudGateWay学习 之 从函数式编程到lambda
SpringCloudGateWay学习 之 从函数式编程到lambda
92 0
SpringCloudGateWay学习 之 从函数式编程到lambda
|
SQL IDE Java
Lambda表达式 函数式编程 Stream API学习笔记
Lambda表达式 函数式编程 Stream API学习笔记
|
安全 Java API
【精通函数式编程】(五) Stream实战大全
本章详解讲解大量常用 Stream的API的使用、原理和一些注意事项,对复杂场景的Stream+lambda表达式的使用。
|
Swift C++
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
280 0
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
|
安全 Java API
Java函数式编程之Optional
java.util.Optional是JDK8中引入的类,它是JDK从著名的Java工具包Guava中移植过来。本文编写的时候使用的是JDK11。Optional是一个包含了NULL值或者非NULL值的对象容器,它常用作明确表明没有结果(其实明确表明存在结果也可以用Optional表示)的方法返回类型,这样可以避免NULL值带来的可能的异常(一般是NullPointerException)。
932 0
|
Kotlin
Kotlin常用的高阶函数(Filter、TakeWhile、Let、Apply、With......)
一、Filter package net.println.kotlin.chapter5.builtins /** * @author:wangdong * @description:Kotlin常见的高阶函数 */ fun main(args: Array) { //求(0.
2575 0