【Java杂记】Optional:一个可以为 null 的容器

324 阅读1分钟

Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。下面就来看看 Optional 类的常用方法。

1.of()

为非 null 的值创建一个 Optional 实例

Optional<String> op1 = Optional.of("helloOptional");
Optional<String> op2 = Optional.of(null); // 抛出异常

那如果我就是要给null创建容器呢,怎么办?接着往下看...

2.isPresent()

如果值存在,返回 true,否则返回 false

System.out.println(op1.isPresent()); // 输出 true

3.get()

返回该对象,有可能返回 null

System.out.println(op1.get()); // 输出 helloOptional

4.OfNullable()

如果指定的值为 null,返回一个空的 Optional

Optional<String> op2 = Optional.ofNullable(null);
System.out.println(op2.isPresent()); // 输出 false

5.ifPresent()

如果实例非空,调用 Comsumer Lambda 表达式

public void ifPresent(Consumer<? super T> consumer) {
    if (value != null)
        consumer.accept(value);
}

使用:

Optional<String> op1 = Optional.of("Hello");
op1.ifPresent((s) -> {
    System.out.println(s); // 输出 Hello
});

6.map()

如果实例非空,调用 Function Lambda 表达式

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

使用:

Optional<String> op1 = Optional.of("Hello");
Optional<String> op2 = op1.map((s) -> s.toUpperCase());
op2.ifPresent((s) -> {
    System.out.println(s); // 输出 HELLO
});

7.orElse(obj)

如果实例非空,返回该实例,否则返回 obj

Optional<String> op1 = Optional.of("Hello");
System.out.println(op1.orElse("World")); // 输出 Hello
Optional<String> op2 = Optional.ofNullable(null);
System.out.println(op2.orElse("World")); // 输出 World

8.orElseGet(Supplier<? extends T> other)

如果实例非空,返回该实例,否则返回 Supplier

Optional<String> op1 = Optional.of("Hello");
System.out.println(op1.orElseGet(() -> {return new String("World");})); // 输出 Hello
Optional<String> op2 = Optional.ofNullable(null);
System.out.println(op2.orElseGet(() -> {return new String("World");})); // 输出 World