jdk1.8 新特性 optional

395 阅读2分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

Optional

为什么要使用Optional?

空对象不应该用来决定系统的行为,它们是意外的Exceptional值,应当被看成是错误,而不是业务逻辑状态

使用Optional可以对null进行处理.

创建Optional

"空"Optional对象

  • of(T value) 创建Optional对象

  • ofNullable(T value) 传入的参数为null时,返回"空"Optional,否则返回包装过value 的Optional对象

    • 包装空值和"空"Optional对象:如果Optional包装null,使用get也会产生NPE,但是如果使用empty()创建"空"Optional对象,
  • empty() 返回"空"Optional对象

常用方法

  • isPresent() 判断Optional包装的值是不为空 : 空→false

    • boolean present1 = Optional.ofNullable(new ListNode()).isPresent();
  • get() 获取Oprional包装的值,如果值为null,会产生NPE

  • orElse(T value) 为空时返回value,否则返回Optional包装的值

  • map() 执行指定的转换方法,这个和stream的map()方法类似

  • filter() 对值进行安全的检查和过滤

  • orElse() 相当于orElse的延迟调用版,当默认指定返回的对象是一个费时费力的操作,就可以使用

  • orElseThrow() 可以能会产生异常

使用map() 获取元素

由于使用get可能会NPE,所以使用map来映射,看到下面的源码,如果为空,就会自动转换为空Optional

image.png

使用orElse()为终点方法,当输出的结果为空,就会指定输出的值

ListNode listNode2 = Optional.ofNullable(listNode).map(e -> e).orElse(new ListNode(2));

测试

可以使用map 多层嵌套判空获取

				ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        listNode1.next = listNode2;
        listNode2.next = listNode3;

//      3层嵌套,刚好能够获取 listNode3    
				Integer integer = Optional.ofNullable(listNode1).map(e -> e.next).map(e -> e.next).map(e -> e.val).orElse(-1);
//      结果为3
				System.out.println(integer);

				//当链表到listNode2结束时,出发了orElse
				Integer integer = Optional.ofNullable(listNode1).map(e -> e.next).map(e -> e.next).map(e -> e.val).orElse(-1);
				// 结果为-1
				System.out.println(integer);

				// 瞎几把谢谢,对每个map判断可以进行逻辑操作
				Integer integer = Optional.ofNullable(listNode1).map(e ->
        {
            System.out.println(e.val);
            e = Optional.ofNullable(e.next).orElse(listNode3);
            return e;
        }).map(e -> e.next).map(e -> e.val).orElse(-1);