Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
最简单的使用,如下:
Optional<Integer> optVal = Optional.ofNullable(val);
if (optVal.isPresent()) {
System.out.println(optVal.get());
}else{
System.out.println("空值");
}
其实这样是等同于jdk8之前的使用方式:
if (val!=null) {
System.out.println(optVal.get());
}else{
System.out.println("空值");
}
所以我们需要关注下面这些方法:
public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)
public void ifPresent(Consumer<? super T> consumer)
public Optional<T> filter(Predicate<? super T> predicate)
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
下面我们一一尝试,先简单描述一下Optional
类的构造方法:
- 方法
Optional.of(T value)
给定的值一定不为空,如果为空则抛出
NullPointerException
-方法Optional.ofNullable(T value)
给定的值可能为空,也可能不为空 - 方法
Optional.empty()
空的Optional
方法ifPresent的使用
Optional<Integer> optVal = Optional.ofNullable(val);
optVal.ifPresent((s)-> System.out.println(s));
如果存在值,则输出
方法orElse的使用
Optional<Integer> optVal = Optional.ofNullable(val);
Integer orElse = optVal.orElse(1);
如果存在返回当前值,否则返回1
方法orElseGet的使用
Integer orElseGet = optVal.orElseGet(() -> returnInt());
private int returnInt() {
return 2;
}
如果存在返回当前值,否则返回方法调用方法返回的值
方法orElseThrow的使用
Integer orElseThrow = optVal.orElseThrow(() -> new RuntimeException("参数为空"));
如果存在返回当前值,否则抛出异常
方法map的使用
User user = new User();
user.setName("optional");
Optional<User> optUer = Optional.of(user);
String name = optUer.map(s -> s.getName()).map(s -> s.toUpperCase()).orElse("空值");
这段代码其实和下面这一段很类似
if (user != null) {
String name1 = user.getName();
if (name1 != null) {
System.out.println(name1.toUpperCase());
}else {
System.out.println("空值");
}
}else {
System.out.println("空值");
}
但是通过对比能看出使用 Optional
后代码更加见解和明了