欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA8 Optional新特性和使用详解

程序员文章站 2022-06-07 11:42:58
...

前言:在介绍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]
[[email protected], [email protected]]

一、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更好的优化我们的代码。