定义
Optional 类是一个可以为null的容器对象,它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。
声明
// 创建Optional对象的三种方式
Optional<String> empty = Optional.empty();
String name = "Alex";
Optional<String> optA = Optional.of(name);
String gender = "female";
Optional<String> optB = Optional.ofNullable(gender);
常用方法
// 判断是否为空
System.out.println(optA.isPresent());//true
// System.out.println(optB.isEmpty());
System.out.println(empty.isPresent());//false
// ifPresent() 方法里面接受一个lambda表达式,表示当对象存在时需要执行的操作。
optA.ifPresent(value -> System.out.println(value));//Alex
System.out.println(optA.orElse("a"));//Alex
System.out.println(empty.orElse("a"));//a
String nullName = null;
String name2 = Optional.ofNullable(nullName).orElseGet(() -> "a");//用Optional.of()会报错
System.out.println(name2);//a
// orElseThrow() 方法表示当Optional里面的值为空的时候,抛出一个异常
// String name3 = Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);
// get()方法表示当Optional的对象不为空的时候,返回Optional对象里面的内容。
System.out.println(optB.get());//female
orElse()与orElseGet()的区别
源码
// orElse()
public T orElse(T other) {
return value != null ? value : other;
}
//orElseGet()
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
例子
import java.util.Optional;
public class OptionalDemo {
static String b() {
System.out.println("B");
return "B";
}
static String a() {
System.out.println("A");
return "A";
}
public static void main(String[] args) {
// 创建Optional对象的三种方式
Optional<String> empty = Optional.empty();
String name = "Alex";
Optional<String> optA = Optional.of(name);
String gender = "female";
Optional<String> optB = Optional.ofNullable(gender);
String nullName = null;
String name2 = Optional.ofNullable(nullName).orElseGet(() -> "a");
String name3 = empty.orElse( "a");
String name4 = optA.orElse(a());
String name5 = optA.orElseGet(()->b());
System.out.println(name2);//a
System.out.println(name3);
System.out.println(name4);
System.out.println(name5);
}
}
// 输出结果
A
a
a
Alex
Alex
差别
- 由输出结果可知,当Optional的值是空值时,无论orElse还是orElseGet都会执行;而当Optional有值时,orElse会执行,而orElseGet则不会执行。
- 传入的参数不同,orElse要传入和Optional一致的数据类型,orElseGet传入Lambda表达式
网友评论