美文网首页
Optional 干掉空指针

Optional 干掉空指针

作者: __元昊__ | 来源:发表于2019-12-27 13:30 被阅读0次

简介

空指针异常是导致Java应用程序失败的最常见原因。
为了解决空指针异常更加优雅,Java8 提供了 Optional 类库。
Optional 实际上是个容器:它可以保存类型T的值,或者仅仅保存null。
Optional 提供很多有用的方法,这样我们就不用显式进行空值检测。

代码示例

  1. Optional.of() 或者 Optional.ofNullable() :创建 Optional 对象,差别在于 of 不允
    许参数是 null ,而 ofNullable 则无限制。
// 参数不能是null
Optional optional1 = Optional.of(1);
// 参数可以是null
Optional optional2 = Optional.ofNullable(null);
// 参数可以是非null
Optional optional3 = Optional.ofNullable(2);
  1. Optional.empty() :所有null包装成的 Optional 对象
Optional optional1 = Optional.ofNullable(null);
Optional optional2 = Optional.ofNullable(null);
System.out.println(optional1 == optional2);// true
System.out.println(optional1 == Optional.empty());// true
Object o1 = Optional.empty();
Object o2 = Optional.empty();
System.out.println(o1 == o2);// true
  1. isPresent() :判断值是否存在
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// isPresent判断值是否存在
System.out.println(optional1.isPresent() == true);
System.out.println(optional2.isPresent() == false);
  1. ifPresent(Consumer consumer) :如果option对象保存的值不是null,则调用consumer对象,否则不调用
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// 如果不是null,调用Consumer
optional1.ifPresent(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println("value is " + t);
}
});
// null,不调用Consumer
optional2.ifPresent(new Consumer<Integer>() {
@Override
public void accept(Integer t) {
System.out.println("value is " + t);
}
});

在1.8时期 Optional 类只为我们提供了代替 if(user != null) 的方法,并未提供支持 if (user != null) else { // xxx}的操作,即JDK1.8中 Optional 类 ifPresent 方法没有对else的操作提供支持
在JDK1.9后改进了 Optional 类增加了 ifPresentOrElse 方法,此方法支持了if (user != null) else { // xxx}的操作

public void Test01(User user) {
        if (user != null) {
            user.getName();
            user.getAge();
        } else {
            System.err.println("user 对象为null");
        }
    }
 
    public void Test02(User user) {
        Optional.ofNullable(user).ifPresentOrElse(u -> {
            user.getName();
            user.getAge();
        }, () -> {
            System.err.println("user 对象为null");
        });
    }
  1. orElse(value) :如果optional对象保存的值不是 null ,则返回原来的值,否则返回 value
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// orElse
System.out.println(optional1.orElse(1000) == 1);// true
System.out.println(optional2.orElse(1000) == 1000);// true
  1. orElseGet(Supplier supplier) :功能与 orElse 一样,只不过 orElseGet 参数是一个对象
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElseGet(() -> 1000) == 1);//true
System.out.println(optional2.orElseGet(() -> 1000) == 1000);//true
  1. orElseThrow() :值不存在则抛出异常,存在则什么不做,有点类似 Guava 的 Precoditions
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
optional1.orElseThrow(() -> {
throw new IllegalStateException();
});
try {
optional2.orElseThrow(() -> {
throw new IllegalStateException();
});
} catch (IllegalStateException e) {
e.printStackTrace();
}
  1. filter(Predicate) :判断 Optional 对象中保存的值是否满足 Predicate ,并返回新的Optional 。
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
Optional<Integer> filter1 = optional1.filter((a) -> a == null);
Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
Optional<Integer> filter3 = optional2.filter((a) -> a == null);
System.out.println(filter1.isPresent());// false
System.out.println(filter2.isPresent());// true
System.out.println(filter2.get().intValue() == 1);// true
System.out.println(filter3.isPresent());// false
  1. map(Function) :对 Optional 中保存的值进行函数运算,并返回新的 Optional (可以是任何类型)
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
Optional<String> str1Optional = optional1.map((a) -> "key" + a);
Optional<String> str2Optional = optional2.map((a) -> "key" + a);
System.out.println(str1Optional.get());// key1
System.out.println(str2Optional.isPresent());// false
  1. flatMap() :功能与 map() 相似,差别请看如下代码。 flatMap 方法与 map 方法类似,区别在于 mapping 函数的返回值不同。 map 方法的 mapping 函数返回值可以是任何类型 T ,而flatMap 方法的 mapping 函数必须是 Optional 。
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Optional<String>> str1Optional = optional1.map((a) -> Optional.of("key"
+ a));
Optional<String> str2Optional = optional1.flatMap((a) -> Optional.of("key" + a))
;
System.out.println(str1Optional.get().get());// key1
System.out.println(str2Optional.get());// key1

Optional类的方法

方法 描述
empty 返回一个空的 Optional 实例
filter 如果值存在并且满足提供的断言, 就返回包含该值的 Optional 对象;否则返回一个空的 Optional 对象
map 如果值存在,就对该值执行提供的mapping 函数调用
flatMap 如果值存在,就对该值执行提供的mapping 函数调用,返回一个Optional 类型的值,否则就返 回一个空的 Optional 对象
get 如果该值存在,将该值用 Optional 封装返回,否则抛出一个NoSuchElementException 异常
ifPresent 如果值存在,就执行使用该值的方法调用,否则什么也不做
isPresent 如果值存在就返回 true,否则返回false
of 将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个NullPointerException 异常
ofNullable 将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的Optional 对象
orElse 如果有值则将其返回,否则返回一个默认值
orElseGet 如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值
orElseThrow 如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常

相关文章

  • Optional 干掉空指针

    简介 空指针异常是导致Java应用程序失败的最常见原因。为了解决空指针异常更加优雅,Java8 提供了 Optio...

  • Java 9 改进的 Optional 类

    Optional 类在 Java 8 中引入,Optional 类的引入很好的解决空指针异常。 Optional ...

  • Java8新特性7--使用Optional解决空指针问题

    使用Optional解决空指针问题 空指针是我们最常见也最讨厌的异常,为了防止空指针异常,你不得在代码里写大量的非...

  • Optional工具

    描述: 可以用Optional来避免空指针。 构造方法: 其他常用方法

  • JDK8新特性:使用Optional

    空指针异Optional常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的...

  • Java8 Optional

    Java8 新增了 Optional 类,可以更加优雅地解决空指针的问题。 构造器 Optional 的构造器是私...

  • JAVA8- Optional-用法浅析

    JAVA8- Optional-用法浅析 简介 java8新引入optional特性,官方说法是更优雅的处理空指针...

  • java8 -Optional

    厌倦了空指针异常? 考虑使用Java SE 8的Optional!使代码更具可读性并使得免受空指针异常的影响。有人...

  • 使用Java 8 Optional类

    从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是空指针异常...

  • java 8中使用Optional 避免空指针

    Optional 类的引入要求程序员强制处理和避免空指针。Optional 需要使用在可能为null的变量上。很多...

网友评论

      本文标题:Optional 干掉空指针

      本文链接:https://www.haomeiwen.com/subject/rbqdoctx.html