Java8 Optional详细解读

简介: Java8 Optional详细解读

01 概述

Optional类主要是为了解决NPENullPointerException)空指针异常而产生的,在我看来它是 Java 实现函数式编程的一种很好的方式。

举个列子看看它的简单用法:

List<Order> list = Optional.ofNullable(orderList)
            .orElseThrow(() -> new RuntimeException("集合不能为空"))
            .stream()
            .sorted(Comparator.comparing(order -> order.getSort()))
            .collect(Collectors.toList());

下面来详细讲解它的用法。

02 Optional详细用法

首先建一个学生Student实体类:

@Data
public class Student {
    /**姓名**/
    private String name;
    /**年龄**/
    private Integer age;
    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

初始化学生信息:

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("张三", 33));
studentList.add(new Student("李四", 40));
studentList.add(new Student("王五", 23));
studentList.add(new Student("赵六", 55));
studentList.add(new Student("陆七", 32));
studentList.add(new Student("王八", 18));

ok,现在可以正式讲解Optional的用法了。

2.1 Optional下的方法

可以看到,Optional根据提示有三个初始化方法,分别是“ofNullable”、“of”、“empty”:

它们的含义如下:

方法 描述
of(T value) 如果valuenull,那么会抛出空指针异常
ofNullable(T value) 如果valuenull,那么就会手动创建一个new Optional()
empty() 此方法返回此Optional类的空实例,就是不包含任何值

可以看到以上的三个方法都是初始化Optional实例而产生的,那么接下来以ofNullable(T value)方法为例子继续讲解。

2.1.1 ofNullable下的方法

可以看到使用ofNullable方法初始化完Optional实例后,有很多的方法,如下图:

它们的含义如下:

方法 秒速
orElse(T other) 当只存在时返回值,不存在返回other(可以理解为自定义值,如字符串的内容)
orElseGet(Supplier<? extends T> other) 值存在返回值,值不存在返回other
orElseThrow() 当前值或当值为null抛出异常
filter() 主要是按条件过滤Optional实例
flatMap() streammap方法类似,都是对变量进行映射转换
map() flatMap差不多一个意思
get() 返回Optional类的实例的值
ifPresent() 检查实例是否存在,这种方式和null != obj没有区别
2.1.1.2 orElseThrow下的方法

orElseThrow下面的方法:

可以看到下面有很多的方法,其实这些方法跟stream流表达是没有其它的区别,具体stream流方式可以参考之前我写的博客:

2.2 Optional完整实例

Optional完整示例如下:

List<Student> students = Optional.ofNullable(studentList)
                .orElseThrow(() -> new RuntimeException("学生集合不能为空"))
                .stream()
                .sorted(Comparator.comparing(student -> student.getAge().intValue()))
                .collect(Collectors.toList());

它主要做了几个事情:

  1. 初始化Optional
  2. 判断集合是否为空,如果为空,则抛出异常
  3. 使用了stream流特性
  4. 根据学生年龄从小打到排序
  5. 生成排序后的集合

03 文末

本文将收录到我的《Java专栏》,有兴趣的童鞋可以参阅下,本文完!

目录
相关文章
|
8月前
|
Java Unix 程序员
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
107 1
|
5月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
156 0
|
4月前
|
设计模式 Java
结合HashMap与Java 8的Function和Optional消除ifelse判断
`shigen`是一位致力于记录成长、分享认知和留住感动的博客作者。本文通过具体代码示例探讨了如何优化业务代码中的if-else结构。首先展示了一个典型的if-else处理方法,并指出其弊端;然后引入了策略模式和工厂方法等优化方案,最终利用Java 8的Function和Optional特性简化代码。此外,还提到了其他几种消除if-else的方法,如switch-case、枚举行、SpringBoot的IOC等。一起跟随shigen的脚步,让每一天都有所不同!
49 10
结合HashMap与Java 8的Function和Optional消除ifelse判断
|
8月前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
195 7
|
5月前
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
191 0
|
7月前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
117 4
|
6月前
|
安全 Java 数据处理
Java面试题:什么是Java中的Optional类及其使用场景?
Java面试题:什么是Java中的Optional类及其使用场景?
90 0
|
6月前
|
Java 容器
Java中使用Optional类的建议
Java中使用Optional类的建议
|
7月前
|
安全 NoSQL Java
探索Java Optional类:构造器、成员变量与方法
探索Java Optional类:构造器、成员变量与方法
|
8月前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
340 3

热门文章

最新文章