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专栏》,有兴趣的童鞋可以参阅下,本文完!

目录
相关文章
|
3天前
|
Java Unix 程序员
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
65 1
|
7月前
|
Java 程序员 API
Java8特性第三讲:如何使用Optional类优雅解决业务npe问题
Java8特性第三讲:如何使用Optional类优雅解决业务npe问题
|
1天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
24 7
|
3天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
21 3
|
3天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
3天前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
3天前
|
Java
Java8 Optional
Java8 Optional
12 0
|
3天前
|
安全 Java 开发者
Java 8 `Optional` 类的用法和优势
【2月更文挑战第15天】
15 0
|
3天前
|
存储 Java
java8新特性-Optional
java8新特性-Optional
21 0
|
3天前
|
JSON 安全 Java
JAVA8实战 - Optional工具类
JAVA8实战 - Optional工具类
85 0