Optional再扩展

2021-01-05

java

他们之所以做得到,就因为他们认为他们能够做到。—— 维吉尔

关于Optional的介绍,之前的博客已经说过了,这里就不再赘述

这里写点常用的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.ruben;

import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**
* @ClassName: OptionalDemo
* @Description: 我还没有写描述
* @Date: 2021/1/5 0005 20:47
* *
* @author: <achao1441470436@gmail.com>
* @version: 1.0
* @since: JDK 1.8
*/
public class OptionalDemo {
public static void main(String[] args) {
String str = null;
// 直接使用Optional.map去调用函数,避免空指针,其中的任意一个函数返回为空的话,则直接调用后面的orElse(String::new)并返回new String()执行的结果
System.out.println(Optional.ofNullable(str).map(""::equals).map(Boolean::getClass).map(Class::getName).orElseGet(String::new));
// 上面的方法,每次都需要使用.map去操作,比较繁琐,于是这里定义一个叫 avoidNPE 的函数去处理空指针异常
// 使用方式如下
System.out.println(avoidNPE(() -> Boolean.valueOf(str.equals("")).equals(Boolean.FALSE)).orElse(false));
// 再来一个对比,更明显一点
// 之前
System.out.println(Optional.ofNullable(Arrays.asList()).map(List::stream).map(Stream::sorted).map(Stream::distinct).flatMap(Stream::findFirst).orElse("empty"));
// 使用自定义的函数后
System.out.println(avoidNPE(() -> Arrays.asList().stream().sorted().distinct().findFirst().orElse("empty")).get());
List<String> list = null;
// 同理,数组越界也可以自定义一个函数做相同处理
avoidNPEOrIOB(list, 5).filter(s -> s.length() > 2).map(String::hashCode).ifPresent(System.out::println);

}

/**
* @MethodName: avoidNPEOrIOB
* @Description: 避免空指针和数组越界
* @Date: 2021/1/5 0005 21:14
* *
* @author: <achao1441470436@gmail.com>
* @param: [list, index]
* @returnValue: java.util.Optional<T>
*/
public static <T> Optional<T> avoidNPEOrIOB(List<T> list, int index) {
try {
return Optional.ofNullable(list.get(index));
} catch (NullPointerException | ArrayIndexOutOfBoundsException e) {
return Optional.empty();
}
}

/**
* @MethodName: avoidNPE
* @Description: 避免空指针
* @Date: 2021/1/5 0005 21:14
* *
* @author: <achao1441470436@gmail.com>
* @param: [supplier]
* @returnValue: java.util.Optional<T>
*/
public static <T> Optional<T> avoidNPE(Supplier<T> supplier) {
try {
return Optional.ofNullable(supplier.get());
} catch (NullPointerException e) {
return Optional.empty();
}
}

}

执行结果

image-20210105211448887