实践1. Lambda配合Optional<T>可以使Java对于null的处理变的异常优雅
这里假设我们有一个person 对象,以及一个personobject的Optional wrapper:
person 对象和判空wrapper
错误实践: Optional<T>如果不结合Lambda使用的话,并不能使原来繁琐的null check变的简单。
鸡肋的Optional用法
正确姿势: 只有当Optional<T>结合Lambda一起使用的时候,才能发挥出其真正的威力!
我们现在就来对比一下下面四种常见的null处理中,Java 8的Lambda+Optional<T>和传统Java两者之间对于null的处理差异。
1. 情况一 - 存在则开干
存在并直接处理
2. 情况二 - 存在则返回,无则返回标记
用于返回
3. 情况三 - 存在则返回,无则由函数产生
存在则返回,无则由函数产生
4. 情况四 - 夺命连环null检查
夺命连环null检查
由上述四种情况可以清楚地看到,Optional<T>+Lambda 可以让我们少写很多ifElse块。尤其是对于情况四那种夺命连环null检查,传统java的写法显得冗长难懂,而新的Optional<T>+Lambda则清新脱俗,清楚简洁。
举个栗子
定义一个列表,并使用其stream和Option功能
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(2);
list.add(4);
list.add(5);
list.add(1);
list.add(20);
// 1. 选出list中的最小值
Stream<Integer> streams = list.stream();
Optional<Integer> minOptional = streams.min(Integer::compareTo);
minOptional.ifPresent(min -> log.info("最小值-{}", min));
streams.close();
// 2. 选出最大值
Stream<Integer> stream = list.stream();
Optional<Integer> maxOptional = stream.max(Integer::compareTo);
maxOptional.ifPresent(max -> log.info("最大值-{}", max));
stream.close();
// 3. 如果有值就返回,否则就返回一个标记
Stream<Integer> stream2 = list.stream();
Optional<Integer> existedOptional = stream2.filter(elem -> elem > 100)
.max(Integer::compareTo);
int result = existedOptional.orElse(-1000);
log.info("过滤结果:{}", result);
stream2.close();
}