Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java编码指南:Java 8 Lambda-Streams中的异常如何优雅处理

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

作者头像
崔认知
发布于 2023-06-20 03:06:00
发布于 2023-06-20 03:06:00
40700
代码可运行
举报
文章被收录于专栏:nobodynobody
运行总次数:0
代码可运行

现象


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

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

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 8 Streams map() 示例
在Java 8中stream().map(),您可以将对象转换为其他对象。查看以下示例:
三产
2021/01/12
7070
JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)
<font color=red>Java 8</font> (又称为 JDK 8或JDK1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。
鱼找水需要时间
2023/06/01
8250
JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)
Java1.8之Lambda表达式、流Stream学习
答:每个人对函数式编程的理解不尽相同。但其核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。 2、Java 8的最大变化是引入了Lambda表达式——一种紧凑的、传递行为的方式。
别先生
2021/01/13
7850
Java集合中的ConcurrentModificationException异常
当底层集合在迭代过程中被修改时,快速失败(fail-fast)迭代器可能会抛出ConcurrentModificationException。
崔认知
2024/09/13
1170
Java集合中的ConcurrentModificationException异常
Lambda表达式和流(Streams)简化代码:提升Java开发效率
在现代Java开发中,Lambda表达式和Streams API已经成为不可或缺的工具,它们可以大幅度简化集合操作和数据处理代码,提升代码的可读性和可维护性。本篇博客将详细介绍如何使用Lambda表达式简化集合处理,以及如何利用Streams API进行流式数据处理,让你在编写Java代码时更加高效。即使你是一个初学者,本文也会通过简单的代码示例帮助你快速上手。
默 语
2025/01/20
970
Java函数式编程神器 VAVR(vavr - turns java™ upside down)
什么是函数式编程 基本概念:他是一种编程范式,对于函数式编程来说,它只关心定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。 特征: stateless:函数不维护任何状态。函数式编程的核心精神是 stateless,简而言之就是它不能存在状态,打个比方,你给我数据我处理完扔出来。里面的数据是不变的。 immutable:输入数据是不能动的,动了输入数据就有危险,所以要返回新的数据集。(不可变的) Jav
袁新栋-jeff.yuan
2021/12/07
7900
Java函数式编程神器 VAVR(vavr - turns java™ upside down)
IO密集型任务使用Java的parallelStream并行流,提高性能及隔离故障,如何自定义线程池
在Java中,parallelStream 是 Java 8 引入的 Stream API 的一部分,它允许并行处理集合中的元素。默认情况下,parallelStream 共享使用默认的 ForkJoinPool 作为其线程池,可能对你的业务影响性能,而且起不到隔离的作用。所以我们需要自定义其使用的线程池。
崔认知
2024/09/13
6540
IO密集型任务使用Java的parallelStream并行流,提高性能及隔离故障,如何自定义线程池
Java避坑指南:不要使用双括号初始化技巧,非静态匿名内部类可能导致内存泄露,发生OOM
你是否在浏览MyBatis官方文档的时候,注意到 https://mybatis.org/mybatis-3/statement-builders.html 介绍The SQL Builder Class的时候提到了SQL类,SQL类为我们编写sql或者动态拼接sql提供了便利。但是官方的举的几个例子使用了Java的双括号初始化技巧。
崔认知
2023/06/20
5920
Java避坑指南:不要使用双括号初始化技巧,非静态匿名内部类可能导致内存泄露,发生OOM
java 1.8 stream使用总结(个人总结有一些经典文章的集合)
☀️相关笔记章节: 🌹java 1.8 stream使用总结(个人总结有一些经典文章的集合) 🌹遍历 ArrayList和遍历 Map的几种方式 🌹Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) 🌹List,Map多层循环嵌套Demo及其理解 🌹List,Map 三种遍历方式:(总结理解) 🌹List<Map<String, Object>>,Map<String,List<Map<String, Object>>>多方式循环遍历
默 语
2024/11/20
1820
java 1.8 stream使用总结(个人总结有一些经典文章的集合)
Lambda 表达式带来的复杂性的破解之道
但是由于 Lambda 表达式的滥用,代码可读性会变差,那么该如何解决? 本文会讨论一下这个问题,并给出自己的几个解决办法。
明明如月学长
2022/02/15
1.4K0
Java 8 Streams简介-Java快速入门教程
Java 8 中的主要新功能之一是引入了流功能 - java.util.stream,其中包含用于处理元素序列的类。
jack.yang
2025/04/05
1000
java8第二篇
Predicate断言式,判断是否符合指定的条件。个人感觉这个函数式接口,常用于集合的过滤操作,我们可以看下其提供的方法都有哪些。
码农王同学
2020/03/25
3010
聊聊lambda
公众号链接:https://mp.weixin.qq.com/s/MFXRBr16LuGn6G2rlOFFEw
阿超
2022/09/27
5930
聊聊lambda
Java避坑指南:多线程批量调用下游接口,如何正确设置总超时时间
多线程批量调用下游接口,设置总超时时间是一种常见的需求,特别是在需要保证程序在预定时间内必须返回,否则超时设置不合理,导致接口变慢。
崔认知
2024/09/13
4550
Java避坑指南:多线程批量调用下游接口,如何正确设置总超时时间
Java避坑指南:java.util.Arrays工具类避坑记
因为Arrays.asList的参数是一个泛型变长参数,但是java中基本类型是不能泛型化的。
崔认知
2023/06/19
1910
Java避坑指南:java.util.Arrays工具类避坑记
Java Stream 优雅编程
Stream 流式编程的出现,显著推进了Java对函数式编程的支持,它允许开发者可以用声明式的方式处理数据集合(比如列表、数组等),还能有效利用多核处理器进行并行操作,提升应用程序的性能,同时保持代码简洁易读。
测试蔡坨坨
2024/06/18
1840
Java Stream 优雅编程
深入理解Java8 Lambda表达式
匿名函数的应用场景是: 通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用Lambda表达式。lambda表达式所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了。
ZhangXianSheng
2019/09/05
4400
使用Java 注解处理器(Annotation Processor)来避免Spring事务抛出受检异常Exception无法回滚
Java 注解处理器(Annotation Processor)是 Java 编译器的一部分,用于处理源代码中的注解信息。它可以在编译时扫描和处理注解,并生成额外的代码或者进行其它的操作。注解处理器可以用来自动生成代码、进行代码检查、生成文档等。
崔认知
2024/01/22
7000
使用Java 注解处理器(Annotation Processor)来避免Spring事务抛出受检异常Exception无法回滚
Java11~Java17新特性: Text Blocks(文本块)-跨越多行字符串书写的好帮手
在Java在代码中嵌入 HTML, XML, SQL, 或 JSON等多行字符串时,我们需要使用换行符"\n"或者字符串拼接"+"操作符以及转义符,可读性大大降低。或者使用StringBuilder优化长字符串拼接操作。
崔认知
2023/06/20
2.9K0
Java11~Java17新特性: Text Blocks(文本块)-跨越多行字符串书写的好帮手
最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)
Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版本也都面向商业收费了,很多新手,我所接触到的,像我那时候一样,追求船新版本,一上来就去学java14的东西,当成一个爱好还行,重心还是要放在实用上
拾荒者的笔记
2020/07/04
3830
推荐阅读
相关推荐
Java 8 Streams map() 示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验