现象
Java 8 Lambda-Streams让我们一步迈入了函数式编程的世界,使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到了提升。
但是Java 8 Lambda-Streams遇到异常时,会终止后续程序运行,而且当我们碰到受检异常时,我们不得不try、catch处理,这样会破坏函数式编程的可阅读性和美观度。
示例:
package com.renzhikeji.demo;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 0, 3, 5, 6, 7, 8);
List<Integer> result = list.stream().map(t -> {
if (t == 0) {
return t / 0;
}
return t;
}).collect(Collectors.toList());
System.out.println(result);
}
}
运行结果(抛出异常,后续流程不再执行):
优雅处理Java 8 Lambda-Streams中的异常
当Java 8 Lambda-Streams中抛出受检异常必须处理或者我们批处理任务,不受单个业务的失败而继续执行时,我们必须处理一切异常。
当然我们有很多自己处理异常的方式,详细可参考:https://javadevcentral.com/throw-checked-exceptions-in-java-streams。
比较优雅的方式是用 vavr封装的Try来处理异常,详见文档:https://docs.vavr.io/#_try。
示例1:
package com.renzhikeji.demo;
import io.vavr.control.Try;
import java.util.Arrays;
import java.util.List;
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 0, 3, 5, 6, 7, 8);
List<Try<Integer>> tryList = list.stream().map(t -> Try.of(() -> {
if (t == 0) {
return t / 0;
}
return t;
})).toList();
for (Try<Integer> aTry : tryList) {
if (aTry.isSuccess()) {
System.out.println(aTry.get());
} else {
aTry.getCause().printStackTrace();
}
}
}
}
运行结果(即使出现异常,后续流程继续执行):
示例2:
package com.renzhikeji.demo;
import io.vavr.control.Try;
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class Demo {
public static void main(String[] args) {
Try<Integer> aTry = Try.of(() -> 0)
.map(t -> 10 / t) //无需try catch异常,后续流程继续执行
.andThen(System.out::print)
.onFailure(e -> e.printStackTrace()) //失败时会触发
.recover(ArithmeticException.class, 0); //遇到特定异常,返回默认值
System.out.println(aTry);
}
}
运行结果:
小结
Java 8 新增的Lambda-Streams遇到异常的情况,目前Java官方团队没有引入更好的处理方式,我们可能需要手动处理,不过我们可以用vavr封装的Try来优雅的处理。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有