跳出Lambda表达式forEach()循环解决思路

背景

在一次需求开发时,发现使用Lambda的forEach()跳不出循环。如下示例代码,想在遍历满足条件时跳出循环。

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 4, 5, 7, 9, 11);

        list.forEach(e -> {
            if (e % 2 == 0) {
                System.out.println("foreach -- " + e);
                return;
            }
            System.out.println(e);
        });

        System.out.println(list);
    }

运行结果:
在这里插入图片描述
可以看出在forEach()中使用return并不会退出整个循环,和普通for循环return意义不同,仍会继续遍历。

原因

在普通for循环中,跳出循环使用break,结束本次循环使用continue,结束for循环所在的整个执行方法使用return。

      for (Integer e : list) {
            if (e % 2 == 0) {
                break;  // return直接整个函数终止执行返回,break for循环方法终止执行
            }
            System.out.println(e);
        }

Lambda表达式中,函数式接口Consumer 的抽象方法accept引用实现循环体中的逻辑。
所以forEach()处理一个个的执行方法accept(t),非循环体。在执行方法中使用return将处理方法返回,但不能结束整个forEach()。

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

优化方案

跳出Lambda表达式forEach()循环解决思路有以下几种:

  • 抛异常
    在遍历时,若需要跳出循环,通过抛异常结束forEach()循环,在循环外catch异常不处理。首先此方案不够优雅,其次若循环逻辑块中有其他抛异常的地方,会受影响不易发现。
   public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 4, 5, 7, 9, 11);

        try {
            list.forEach(e -> {
                if (e % 2 == 0) {
                    System.out.println("foreach -- " + e);
                    throw new RuntimeException("跳出循环");
                }
                System.out.println(e);
            });
        } catch (Exception e) {}

        System.out.println(list);
   }

执行结果:
在这里插入图片描述

  • 使用普通for循环
    使用普通for循环替代Lambda表达式forEach()循环,在代码块中使用break即可跳出循环。

  • 使用Lambda表达式filter()实现
    换个实现思路,诉求是遍历list遇到第一个满足条件的item跳出循环,那么转成过滤整个list,返回第一个满足条件的item。

Optional<Integer> first = list.stream().filter(e -> e % 2 == 0).findFirst();
System.out.println(first.orElse(null));
  • 使用anyMatch()
    原理类似filter(),遇到满足条件的item跳出遍历返回。
      list.stream().anyMatch(e -> {
            if (e % 2 == 0) {
                System.out.println("跳出循环 -- " + e);
                return true;
            }
            System.out.println(e);
            return false;
        });

执行结果:
在这里插入图片描述

总结

Lambda表达式forEach()函数不支持return跳出循环,不建议使用抛异常方式结束循环,可以考虑使用普通for或利用Lambda表达式的函数实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库安装,在自己的windows电脑上面。

第一步&#xff1a;找到数据库和数据库图形用户界面安装包。 直接用迅雷下载&#xff1a;数据库分为服务器端和客户端。 服务器端 操作系统&#xff1a;Windows Server 2008 企业版64位 Oracle软件:Oracle 11g 64位 客户端 操作系统&#xff1a;Windows7 64位 图形界面工…

IM即时聊天项目

目录 IM即时聊天项目WebSocket 原理搭建环境设置代理创建环境配置驱动&#xff08;搭建环境需要的驱动&#xff09;conf&#xff08;配置信息&#xff09;cache&#xff08;redis&#xff09;model&#xff08;数据库连接&#xff09; 用户注册serializermodelserviceapirouter…

15、监测数据采集物联网应用开发步骤(11)

源码将于最后一遍文章给出下载 监测数据采集物联网应用开发步骤(10) 程序自动更新开发 前面章节写了部分功能模块开发&#xff1a; 日志或文本文件读写开发;Sqlite3数据库读写操作开发;定时器插件化开发;串口(COM)通讯开发;TCP/IP Client开发;TCP/IP Server 开发;modbus协议…

c语言开篇---跟着视频学C语言

标识符 标识符必须声明定义&#xff0c;可以是变量、函数或其他实体。 Int是标识符吗&#xff1f; 不是&#xff0c;int是c语言关键词&#xff0c;不是随意命名的 C语言关键词如下&#xff1a; 常量 不需要被声明&#xff0c;不能赋值更改。 printf函数 printf是由print打印…

CLIP:连接文本-图像

Contrastive Language-Image Pre-Training CLIP的主要目标是通过对比学习&#xff0c;学习匹配图像和文本。CLIP最主要的作用&#xff1a;可以将文本和图像表征映射到同一个表示空间 这是通过训练模型来预测哪个图像属于给定的文本&#xff0c;反之亦然。在训练过程中&#…

《Go 语言第一课》课程学习笔记(十二)

函数 Go 函数与函数声明 在 Go 语言中&#xff0c;函数是唯一一种基于特定输入&#xff0c;实现特定任务并可返回任务执行结果的代码块&#xff08;Go 语言中的方法本质上也是函数&#xff09;。在 Go 中&#xff0c;我们定义一个函数的最常用方式就是使用函数声明。 第一部…

软件测试/测试开发丨Python 学习笔记 之 链表

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/26458 链表与数组的区别 复杂度分析 时间复杂度数组链表插入删除O(n)O(1)随机访问O(1)O(n) 其他角度分析 内存连续&#xff0c;利用CPU的机制&#xff0…

中间件环境搭建配置过程解读

中间件环境搭建 目录 中间件环境搭建xampp 搭建环境Tomcat环境配置安装mysql连接mysql 问题解决 xampp 搭建环境 安装xampp服务集成环境工具 官网地址下载项目压缩包&#xff0c;将项目文件夹放在xampp安装目录的htdocs文件夹下初始化xampp&#xff1a;运行目录内的setup_xamp…

idea远程debug调试

背景 有时候我们线上/测试环境出现了问题&#xff0c;我们本地跑却无法复现问题&#xff0c;使用idea的远程debug功能可以很好的解决该问题 配置 远程debug的服务&#xff0c;我们使用Springboot项目为例(SpringCloud作为微服务项目我们可以可以使用本地注册到远程项目&…

QT day1登录界面设计

要设计如下图片&#xff1a; 代码如下&#xff1a; main.cpp widget.h widget.cpp 运行效果&#xff1a; 2&#xff0c;思维导图

关于 MySQL、PostgresSQL、Mariadb 数据库2038千年虫问题

MySQL 测试时间&#xff1a;2023-8 启动MySQL服务后&#xff0c;将系统时间调制2038年01月19日03时14分07秒之后的日期&#xff0c;发现MySQL服务自动停止。 根据最新的MySQL源码&#xff08;mysql-8.1.0&#xff09;分析&#xff0c;sql/sql_parse.cc中依然存在2038年千年虫…

黑马 大事件项目 笔记

学习视频&#xff1a;黑马 Vue23 课程 后台数据管理系统 - 项目架构设计 在线演示&#xff1a;https://fe-bigevent-web.itheima.net/login 接口文档: https://apifox.com/apidoc/shared-26c67aee-0233-4d23-aab7-08448fdf95ff/api-93850835 接口根路径&#xff1a; http:/…

三维点云转换为二维图像

文章目录 前言原理代码总结与反思实验结果展示 前言 目的&#xff1a;将三维点云转换为二维图像 作用&#xff1a; a.给点云赋予彩色信息&#xff0c;增强点云所表达物体或对象的辨识度&#xff1b; b.将三维点云中绘制的目标物体通过映射关系绘制到二维图像中&#xff0c;这个…

报错处理:Disk space full

报错环境&#xff1a; Linux 具体报错&#xff1a; No space left on device&#xff0c;磁盘空间已满 排错思路&#xff1a; 当磁盘空间耗尽时&#xff0c;会出现磁盘空间已满的错误。这可能是由于磁盘上的文件过多或者某个文件系统占用了过多磁盘空间。 解决方法&#xff1a;…

UE5- c++ websocket客户端写法

# 实现目标 ue5 c 实现socket客户端&#xff0c;读取服务端数据&#xff0c;并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息&#xff0c;最终输出如下&#xff1a; using UnrealBuildTool;…

深入探讨梯度下降:优化机器学习的关键步骤(二)

文章目录 &#x1f340;引言&#x1f340;eta参数的调节&#x1f340;sklearn中的梯度下降 &#x1f340;引言 承接上篇&#xff0c;这篇主要有两个重点&#xff0c;一个是eta参数的调解&#xff1b;一个是在sklearn中实现梯度下降 在梯度下降算法中&#xff0c;学习率&#xf…

Maven 基础之安装和命令行使用

Maven 的安装和命令行使用 1. 下载安装 下载解压 maven 压缩包&#xff08;http://maven.apache.org/&#xff09; 配置环境变量 前提&#xff1a;需要安装 java 。 在命令行执行如下命令&#xff1a; mvn --version如出现类似如下结果&#xff0c;则证明 maven 安装正确…

无涯教程-Android - ImageButton函数

ImageButton是一个AbsoluteLayout,可让您指定其子级的确切位置。这显示了带有图像(而不是文本)的按钮,用户可以按下或单击该按钮。 Android button style set ImageButton属性 以下是与ImageButton控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以…

webrtc 的Bundle group 和RTCP-MUX

1&#xff0c;最近调试程序的时候发现抱一个错误 max-bundle configured but session description has no BUNDLE group 最后发现是一个参数设置错误 config.bundle_policy webrtc::PeerConnectionInterface::BundlePolicy::kBundlePolicyMaxBundle; 2&#xff0c;rtcp-mu…

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…