文章目录

  • 一、Optional简介
  • 二、应用Optional
  • 1、创建Optional对象
  • 2、Optional中map用法
  • 3、Optional其它方法用法
  • 三、Optional实战
  • 1、创建Optional实例
  • 2、默认值

前言:在介绍Optional之前我们先回顾Stream流中两个方法map和flatMap区别。

  1. map只是一维 1对1 的映射
  2. 而flatmap可以将一个2维的集合映射成一个一维,相当于他映射的深度比map深了一层。说的专业点就是,各个流会被合并或者扁平化为一个单一的流。
    例:
public static void mapAndFlatMap() {
        String[] array = {"HELLO","WORLD"};
        Stream<String> stream = Arrays.stream(array);
        List<String> collect = stream.map(s -> s.split("")).flatMap(Arrays::stream).collect(toList());
        System.out.println(collect);
        stream = Arrays.stream(array);
        List<Stream<String>> collect1 = stream.map(s -> s.split("")).map(Arrays::stream).collect(toList());
        System.out.println(collect1);
    }

运行结果:

[H, E, L, L, O, W, O, R, L, D]
[java.util.stream.ReferencePipeline$Head@1218025c, java.util.stream.ReferencePipeline$Head@816f27d]

一、Optional简介

作为java程序员,相信大家都遇到过NullPointerException这个异常。这个空指针的由来是,1965年,英国一位计算机科学家Horae提出来的,设计初衷是通过编译器的自动检测机制,确保所有使用和引用方法
都是绝对安全。
在java8汲取了Haskell和Scala的灵感,引入了一个新类Optional。变量存在时Optional只是对类简单封装,变量不存在时会被建模成空的Optional对象,由方法Optional.empty()返回。

二、应用Optional

在使用之前我们先学习如果创建Optional对象。

1、创建Optional对象

  • 创建空的Optional对象
    Optional optCar = Optional.empty();
  • 创建非空Optional对象
    Optional optCar = Optional.of(obj);
  • 可接受null的Optional对象
    Optional optCar = Optional.ofNullable(obj);

2、Optional中map用法

从对象种提取信息java8之前我们需要这些做。
例:

String name = null;
if(obj != null) {
	name = obj.getName();
}

但是java8之后我可以用一行代码来完成。

Optional<Object> optObj = Optional.ofNullable(obj);
Optional<String> name = optInsurance.map(Object::getName);

3、Optional其它方法用法

Optional类中还有许多其它方法,我们对它进行分类和概括,帮助大家加深印象。

方法

描述

empty

返回一个空的Optional实例

filter

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

flatMap

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

get

如果该值存在,将该值用Optional封装返回,否则抛出一个NoSuchElementException异常

ifPresent

如果值存在,就返回使用该值的方法调用,否则什么也不做

isPresent

如果值存在就返回true,否则返回false

map

如果只存在,就对该值执行提供的mapping函数

of

将执行值用Optional封装返回,如果该值是null,则抛出NullPointerException异常

ofNullable

将执行值用Optional封装返回,如果该值是null,则返回一个空的Optional对象

orElse

如果有值则将其返回,否则返回一个默认值

orElseGet

如果有值则将其返回,否则返回一个指定的Supplier接口生成的值

orElse

如果有值则将其返回,否抛出一个指定的Supplier接口生成的异常

三、Optional实战

1、创建Optional实例

Optional<Dish> dish1 = Optional.of(dish);
  Optional<Dish> dish2 = Optional.ofNullable(dish);

2、默认值

Optional<Dish> dish1 = Optional.of(dish).orElse(new Dish());

综上所知,如果我们想要使用Optional的强大功能,可以封装一个工具类OptionalUtil更好的优化我们的代码。