首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java编码指南:Java 8 Lambda-Streams中的异常如何优雅处理

Java编码指南:Java 8 Lambda-Streams中的异常如何优雅处理

作者头像
崔认知
发布2023-06-20 11:06:00
发布2023-06-20 11:06:00
5700
举报
文章被收录于专栏:nobodynobody

现象


Java 8 Lambda-Streams让我们一步迈入了函数式编程的世界,使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到了提升。

但是Java 8 Lambda-Streams遇到异常时,会终止后续程序运行,而且当我们碰到受检异常时,我们不得不try、catch处理,这样会破坏函数式编程的可阅读性和美观度。

示例:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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来优雅的处理。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档