zoukankan      html  css  js  c++  java
  • 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 详解

  • 相关阅读:
    各国语言缩写列表,各国语言缩写-各国语言简称,世界各国域名缩写
    How to see log files in MySQL?
    git 设置和取消代理
    使用本地下载和管理的免费 Windows 10 虚拟机测试 IE11 和旧版 Microsoft Edge
    在Microsoft SQL SERVER Management Studio下如何完整输出NVARCHAR(MAX)字段或变量的内容
    windows 10 x64系统下在vmware workstation pro 15安装macOS 10.15 Catelina, 并设置分辨率为3840x2160
    在Windows 10系统下将Git项目签出到磁盘分区根目录的方法
    群晖NAS(Synology NAS)环境下安装GitLab, 并在Windows 10环境下使用Git
    使用V-2ray和V-2rayN搭建本地代理服务器供局域网用户连接
    windows 10 专业版安装VMware虚拟机碰到的坑
  • 原文地址:https://www.cnblogs.com/y3blogs/p/13168541.html
Copyright © 2011-2022 走看看