• Optional 容器类


    什么是Optional容器类

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

    Optional类常用方法:

    Optional.of(T t) : 创建一个 Optional 实例。

    Optional.empty() : 创建一个空的 Optional 实例。

    Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例。

    isPresent() : 判断是否包含值。

    orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。

    orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。

    orElseThrow(Supplier es) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常。

    map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()。

    flatMap(Function mapper):与 map 类似,要求返回值必须是Optional。

    filter(Predicate p):接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象。

    示例:

     1 import org.junit.Test;
     2 import java.util.Optional;
     3 /*
     4  * Optional 容器类:用于尽量避免空指针异常
     5  *     Optional.of(T t) : 创建一个 Optional 实例
     6  *     Optional.empty() : 创建一个空的 Optional 实例
     7  *     Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
     8  *     isPresent() : 判断是否包含值
     9  *     ifPresent(Consumer<? super T> consumer) 判断是否包含值,再执行 consumer
    10  *     orElse(T t) :  如果调用对象包含值,返回该值,否则返回t
    11  *     orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
    12  *     orElseThrow(Supplier<? extends X> exceptionSupplier) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常
    13  *     map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
    14  *     flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
    15  *     filter(Predicate<? super T> predicate):接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象
    16  *
    17  *     map、flatMap 和 filter 的使用方法和 StreamAPI 中的一样
    18  */
    19 public class TestOptional {
    20 
    21 
    22     /**
    23      * 创建 Optional 实例
    24      */
    25     @Test
    26     public void test1(){
    27 
    28         // Optional.empty() : 创建一个空的 Optional 实例
    29         Optional<String> empty = Optional.empty();
    30         System.out.println(empty);// 输出结果:Optional.empty
    31         //System.out.println(empty.get());// 报错:java.util.NoSuchElementException: No value present
    32 
    33         //    Optional.of(T t) : 创建一个 Optional 实例
    34         Optional<Employee> eop = Optional.of(new Employee());
    35         System.out.println(eop);// 输出结果:Optional[Employee{name='null', age=null, gender=null, salary=null, status=null}]
    36         System.out.println(eop.get());//输出结果:Employee{name='null', age=null, gender=null, salary=null, status=null}
    37 
    38         //注意:Optional.of(T t) 中,传递给of()的值不可以为空,否则会抛出空指针异常
    39         //Optional<Employee> eop1 = Optional.of(null);//这一行直接报错:java.lang.NullPointerException
    40 
    41         //Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
    42         //所以,在创建Optional对象时,如果传入的参数不确定是否会为Null时,就可以使用 Optional.ofNullable(T t) 方式创建实例。
    43         Optional<Object> op = Optional.ofNullable(null);//这样的效果和 Optional.empty() 一样
    44         System.out.println(op);//Optional.empty
    45         op = Optional.ofNullable(new Employee());//
    46         System.out.println(op);//Optional[Employee{name='null', age=null, gender=null, salary=null, status=null}]
    47     }
    48 
    49 
    50     /**
    51      * isPresent() : 判断是否包含值
    52      * ifPresent(Consumer<? super T> consumer) 判断是否包含值,再执行 consumer
    53      */
    54     @Test
    55     public void test2(){
    56         Optional<Employee> opt = Optional.of(new Employee());
    57         System.out.println(opt.isPresent());//输出结果:true
    58         opt = Optional.ofNullable(null);
    59         System.out.println(opt.isPresent());//输出结果:false
    60         opt.ifPresent(employee -> System.out.println(employee));// 如果 opt.isPresent() 为false ,这里就不输出,否则就输出 employee
    61     }
    62 
    63     /**
    64      *     orElse(T t) :  如果调用对象包含值,返回该值,否则返回t
    65      *     orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
    66      */
    67     @Test
    68     public void test3(){
    69         //Optional<Employee> opt = Optional.of(new Employee());
    70         Optional<Employee> opt = Optional.ofNullable(null);
    71         /*Employee emp = opt.orElse(new Employee("张三",20));
    72         System.out.println(emp);*/
    73 
    74         int condition = 2;//模拟条件
    75         Employee emp = opt.orElseGet(()-> {
    76             if (condition == 1){
    77                 return new Employee("李四");
    78             }else if (condition == 2){
    79                 return new Employee("王二麻子");
    80             }else {
    81                 return new Employee("赵六");
    82             }
    83         });
    84         System.out.println(emp);
    85     }
    86     /**
    87      *     orElseThrow(Supplier<? extends X> exceptionSupplier) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常
    88      */
    89     @Test
    90     public void test4(){
    91         Object obj = Optional.ofNullable(null).orElseThrow(IllegalArgumentException::new);//当参数为null,则抛出一个不合法的参数异常
    92         System.out.println(obj);
    93     }
    94 
    95 
    96 }

    备注:map、flatMap 和 filter 的使用方法和 StreamAPI 中的一样,如需了解详细使用方法,请参考:Stream API 详解

  • 相关阅读:
    “冷面杀手”王励勤赢了
    当VS.NET 无法调试时,不妨尝试一下下面的办法
    Oracle如何调用Windows动态链接库
    根本不值得一提的乒乓球国手王浩
    向总版主提一些建议
    你的家乡话,你还知多少
    黄山三日游(200706020604)
    今天是我的生日,常怀感恩的心
    如果有一个工具可以帮助你将你的代码可视化,你需要吗?
    是社会变化太快,还是我心态有有点怪
  • 原文地址:https://www.cnblogs.com/y3blogs/p/13168541.html
Copyright © 2020-2023  润新知