详解Java8特性之Optional类

Optional类

在Java中,可能我们看过最多的异常就是java.lang.NullPointerException,这是使用null引用去调用一个方法或者字段的结果。

Java 8中提供了java.util.Optional 类,是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且
可以避免空指针异常。

Optional常用方法有以下这些:

  • Optional.of(T t) : 创建一个 Optional 实例
  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • T get():获取Optional中的值
  • isPresent() : 判断是否包含值
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
  • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

Optional的增加操作和他的创建一起,即增加一个元素便是创建一个Optional实例。下面是创建容器的例子

@Test
public void test() {
    // Optional.of(T t)
    Optional<String> optional = Optional.of("321");
    // 下面这句代码会报NullPointerException
    Optional<String> optional2 = Optional.of(null);

    // Optional.empty()
    Optional<Object> emptyOptional = Optional.empty();

    // Optional.ofNullable(T t)
    Optional<String> nullableOptional = Optional.ofNullable("123");
    // 下面这句代码不会报错,因为ofNullable(T t)创建Optional时允许t为null,相当于Optional.empty()
    Optional<Object> nullableOptional2 = Optional.ofNullable(null);

}

通过get()方法可以从Optional实例中获取到存放的值。如

@Test
public void test() {
    Optional optional = Optional.of("123");
    String str = optional.get();
    System.out.println(str);//输出123
}

isPresent()判断是否包含值,有点像是我们判断一个集合的size是否大于0。如

@Test
public void test() {
    Optional optional = Optional.of("123");
    boolean b = optional.isPresent();
    System.out.println(b);// 输出true

    optional = Optional.ofNullable(null);
    b = optional.isPresent();
    System.out.println(b);// 输出false
}

其它方法就不一一试验了,总之这个Optional类其实就是一个封装了一个元素的容器,而这个元素可以是null也可以是其它任意类型的。

你可能感兴趣的:(Java基础,Java8特性)