欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Optional

程序员文章站 2022-03-04 11:48:32
...

API文档:https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

https://www.runoob.com/java/java8-optional-class.html 

https://blog.csdn.net/qq_40794973/article/details/86882454#t60

臭名昭著的空指针异常是导致Java应用程序失败的最常见原因;以前为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码;受到Google Guava的启发Optional类已经成为Java 8类库的一部分

Optional实际上是个容器,它可以保存类型T的值,或者仅仅保存null;Optional提供很多有用的方法,这样我们就不用显式进行空值检测;

Optional类的Javadoc描述如下:这是一个可以为null的容器对象;如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象;

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

类方法
方法  描述
<T> Optional<T> empty() 创建一个空的Optional实例
<T> Optional<T> of(T value) 创建一个指定非null值的Optional实例
<T> Optional<T> ofNullable(T value) value不为 null,创建Optional 实例,否则创建空实例
isPresent() 如果值存在则方法会返回true,否则返回 false
T get() 如果调用对象包含值,返回该值,否则抛异常
T orElse(T other) 如果调用对象包含值,返回该值,否则返回other
T orElseGet(Supplier<? extends T> other) 如果调用对象包含值,返回该值,否则触发 other,并返回 other 调用的结果
map(Function<? super T, ? extends U> mapper) 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function<? super T, Optional<U>> mapper) 与 map 类似,要求返回值必须是Optional
@Test
public void testOf(){
    Optional<Object> op = Optional.of(new Object());
    Object obj = op.get();
    System.out.println(obj);
}
@Test
public void test() {
    //Optional<Object> op = Optional.of(null); // 这样是不可以的,这样可以以最快的速度定位异常

    //有的时候我就想构建一个空的Optional的
    Optional<Object> op2 = Optional.empty();
    System.out.println(op2.get());

    //ofNullable 是另外两个的综合
    //public static <T> Optional<T> ofNullable(T value) {
    //     return value == null ? empty() : of(value);
    //}
    Optional<Object> op3 = Optional.ofNullable(null);
    System.out.println(op3.get());
}
@Test
public void test() {
    Pair<String, String> user = null;//new Pair<>("name", "卢本伟");
    Optional<Pair<String, String>> op = Optional.ofNullable(user);
    if (op.isPresent()) {
        System.out.println(op.get());
    }

    Pair emp = op.orElse(new Pair<>("name", "乔碧萝"));
    System.out.println(emp);

    //和上面的相比,这个可以添加判断
    Object emp2 = op.orElseGet(() -> new Pair<>("name", "蔡徐坤"));
    System.out.println(emp2);
}
@Test
public void test() {
    Optional<Pair<String, String>> op = Optional.of(new Pair<>("name", "卢本伟"));

    Optional<String> op2 = op.map(Pair::getValue);
    System.out.println(op2.get());

    //进一步避免异常
    Optional<String> op3 = op.flatMap((user) -> Optional.of(user.getValue()));
    System.out.println(op3.get());
}

 

相关标签: Java