「这是我参与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包装的值是不为空 : 空→falseboolean 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
使用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);