JAVA8 Optional新特性和使用详解
程序员文章站
2022-06-07 11:42:58
...
文章目录
前言:在介绍Optional之前我们先回顾Stream流中两个方法map和flatMap区别。
- map只是一维 1对1 的映射
- 而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更好的优化我们的代码。
上一篇: 2019-CCPC-秦皇岛站-Problem I. Invoker(DP)
下一篇: vue步骤条