当前位置: 首页 > news >正文

跳出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表达式的函数实现。

相关文章:

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

背景 在一次需求开发时&#xff0c;发现使用Lambda的forEach()跳不出循环。如下示例代码&#xff0c;想在遍历满足条件时跳出循环。 public static void main(String[] args) {List<Integer> list Arrays.asList(1, 4, 5, 7, 9, 11);list.forEach(e -> {if (e % 2 …...

2023年度AWS SAP直冲云霄训练营学习分享

AWS在公有云市场一直处于行业领先地位&#xff0c;其培训认证体系也是非常的完善的。而且经常在国内组织一些技术论坛&#xff0c;技术分享&#xff0c;公开课&#xff0c;训练营等技术活动。 AWS训练营适合希望学习和考取AWS助理级架构师/专家级架构师&#xff08;AWS SAA/AW…...

2023高教社杯 国赛数学建模E题思路 - 黄河水沙监测数据分析

1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…...

06_快速入门案例实战之电商网站商品管理:集群健康检查,文档CRUD

document数据格式电商网站商品管理案例&#xff1a;背景介绍简单的集群管理商品的CRUD操作&#xff08;document CRUD (3) 集群的管理 1.快速检查集群的健康状态: cat api 可以查看es中各种各样的数据 GET /_cat/health?v epoch timestamp cluster status node…...

机车整备场数字孪生 | 图扑智慧铁路

机车整备场是铁路运输系统中的重要组成部分&#xff0c;它承担着机车的维修、保养和整备工作&#xff0c;对保障铁路运输的运维和安全起着至关重要的作用。 随着铁路运输的发展、机车技术的不断进步&#xff0c;以及数字化转型的不断推进&#xff0c;数字孪生技术在机车整备场…...

Fair|Fur —— Geometry Nodes

目录 Groom Blend Groom Fetch Groom Pack Groom Unpack Groom Switch Guide Advect Guide Collide With VDB Guide Deform Guide Draw Guide Groom Guide Group Guid Grow to Surface Guide Initialize Guide Mask Guide Partition Guide Process Guide Skin…...

java八股文面试[设计模式]——行为型模式

目录 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式关注的是各个类之间的相互作用&#xff0c;将职责划分清楚&#xff0c;使得我们的代码更加地清晰。 策略模式 策略模式太常用了 下面设计的场景是&#xff0c;我们需要画一个图形&#xff0c;可选…...

【送书活动】网络安全(黑客)自学

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

如何让数据成为企业的生产力?

为什么有的企业投入大量的人力、物力、财力做数字化转型建设最终做了个寂寞&#xff01;企业领导没看到数字化的任何价值&#xff01; 如果要问企业数字化转型建设最核心的价值体现是什么&#xff0c;大部分人都会说是&#xff1a;数据&#xff01; 然而&#xff0c;不同的人…...

监控 -- linux中的一些系统性能状态指令、Prometheus

目录 监控查看性能相关命令Prometheus1、安装和配置2、将 NFS服务器和LB服务器作为exporter采集数据3、在prometheus server里添加安装exporter程序的服务器 grafana出图工具 监控 监控的目的是获取数据&#xff0c;通过数据分析了解机器是否正常运行 查看性能相关命令 查看c…...

跳槽面试:如何转换工作场所而不失去优势

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

TINA如何导入spice模型

本文介绍如何使用TINA仿真运算放大器电路。TINA是TI公司自己的spice仿真软件&#xff0c;各个大厂为了更好的让客户使用自己的器件&#xff0c;都纷纷推出自己的仿真软件&#xff0c;ADI也有类似的软件&#xff0c;有机会我们介绍&#xff0c;这期我们主要简单介绍下如何使用TI…...

C. MEX Repetition Pinely Round 2 (Div. 1 + Div. 2)

Problem - C - Codeforces 题目大意&#xff1a;有一个长度为n的数组&#xff0c;数组中每个数字互不相同&#xff0c;范围都是0到n&#xff0c;每次操作将每一个数字从左到右依次变成当前数组的MEX&#xff0c;问k次操作后的数组 1<n<1e5&#xff1b;1<k<1e9 思…...

C++ 运算符

一键三连支持一下吧 C 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 本章将逐一介绍算术运算符、关系运算符、逻辑…...

数据结构day07(栈和队列)

今日任务 链式队列&#xff1a; head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <stdlib.h>typedef int datatype; typedef struct link_list{datatype data;struct link_list* next; }link,*linkp; typedef struct circulate_line_t…...

八、Linux中的用户与文件权限

1、普通用户与特权用户 (1)在Linux中&#xff0c;和windows中一样。用户分为普通用户和特权用户。 特权用户&#xff1a;拥有系统管理的绝对权限。普通用户&#xff1a;普通用户的权限受到限制&#xff0c;只拥有基本的权限&#xff0c;某些操作没有权限。 (2)Linux中的特权…...

岛屿数量 -- 二维矩阵的dfs算法

岛屿数量 又被称为 FloodFill 算法 class NumIslands:"""floodFill 算法https://leetcode.cn/problems/number-of-islands/"""def solution(self, grid: List[List[str]]) -> int:res 0m, n len(grid), len(grid[0])for i in range(m):for…...

JDBC学习汇总

概念 JDBC&#xff1a;JDBC是Java提供的一套用来操作数据库的接口 通过Java代码操作数据库 1.确定数据库是可以正常使用&#xff08;MySQL服务是否正常开启&#xff09; 2.确定MySQL的账号和密码是正确的 3.确定MySQL版本和MySQL驱动版本匹配 4.在工程&#xff08;module&#…...

HarmonyOS—UI开发性能提升的推荐方法

注&#xff1a;本文转载自HarmonyOS官网文档 开发者若使用低性能的代码实现功能场景可能不会影响应用的正常运行&#xff0c;但却会对应用的性能造成负面影响。本章节列举出了一些可提升性能的场景供开发者参考&#xff0c;以避免应用实现上带来的性能劣化。 使用数据懒加载 开…...

英文科技论文写作与发表-常见英语写作困扰(第3章)

1.常见英语写作困扰 英语写作应该是越精炼越好。写完一个句子&#xff0c;建议尝试删除某个或某些单词&#xff0c;如果删除后句子意义基本不变&#xff0c;就应该删除。 1.1 所有格 使用所有格可以省去至少一个单词&#xff08;of&#xff09;,如&#xff1a;Kangs book T…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...