java中有两个list列表,尽量少的去循环
java中有两个list列表,一个list列表是paymentRecord,另外一个list是listApplyBase,paymentRecord中的lendCode字段值跟listApplyBase中的repaymentCode字段值是对应的,用stream流去循环paymentRecord列表,然后判断当paymentRecord中的lendCode字段值跟listApplyBase中的repaymentCode字段值相等时打印listApplyBase中的信息,尽量少的去循环。
为了实现你的需求,我们可以使用Java Stream API来高效地处理两个列表的匹配问题。具体步骤如下:
将 listApplyBase 转换为 Map:将 listApplyBase 转换为一个 Map,其中键是 repaymentCode,值是 repaymentApply 对象。这样可以在后续的匹配过程中快速查找。
使用 Stream API 遍历 paymentRecord 列表:在遍历 paymentRecord 列表时,使用 Map 来快速查找匹配的 repaymentApply 对象。
示例代码
假设你有两个类 paymentRecord 和 repaymentApply,它们的定义如下:
Java
深色版本
class paymentRecord {
private String lendCode;
private String otherField1;
private double amount;
// 构造函数
public paymentRecord(String lendCode, String otherField1, double amount) {
this.lendCode = lendCode;
this.otherField1 = otherField1;
this.amount = amount;
}
// Getter 和 Setter 方法
public String getlendCode() {
return lendCode;
}
public void setlendCode(String lendCode) {
this.lendCode = lendCode;
}
public String getOtherField1() {
return otherField1;
}
public void setOtherField1(String otherField1) {
this.otherField1 = otherField1;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
@Override
public String toString() {
return "paymentRecord{" +
"lendCode='" + lendCode + '\'' +
", otherField1='" + otherField1 + '\'' +
", amount=" + amount +
'}';
}
}
class repaymentApply {
private String repaymentCode;
private String otherField1;
private int otherField2;
// 构造函数
public repaymentApply(String repaymentCode, String otherField1, int otherField2) {
this.repaymentCode = repaymentCode;
this.otherField1 = otherField1;
this.otherField2 = otherField2;
}
// Getter 和 Setter 方法
public String getrepaymentCode() {
return repaymentCode;
}
public void setrepaymentCode(String repaymentCode) {
this.repaymentCode = repaymentCode;
}
public String getOtherField1() {
return otherField1;
}
public void setOtherField1(String otherField1) {
this.otherField1 = otherField1;
}
public int getOtherField2() {
return otherField2;
}
public void setOtherField2(int otherField2) {
this.otherField2 = otherField2;
}
@Override
public String toString() {
return "repaymentApply{" +
"repaymentCode='" + repaymentCode + '\'' +
", otherField1='" + otherField1 + '\'' +
", otherField2=" + otherField2 +
'}';
}
}
主要逻辑
Java
深色版本
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Main {
public static void main(String[] args) {
// 假设你有两个服务类,可以从数据库中获取数据
List<paymentRecord> paymentRecord = opPaymentService.list();
List<repaymentApply> listApplyBase = opRepaymentService.list();
// 将listApplyBase转换为Map
Map<String, repaymentApply> applyBaseMap = listApplyBase.stream()
.collect(Collectors.toMap(
repaymentApply::getrepaymentCode, // 生成Map的键
user -> user // 生成Map的值
));
// 使用Stream API遍历paymentRecord列表
paymentRecord.stream()
.filter(record -> applyBaseMap.containsKey(record.getlendCode()))
.forEach(record -> {
repaymentApply applyBase = applyBaseMap.get(record.getlendCode());
log.info("Matching repaymentApply: {}", applyBase);
});
}
}
详细解释
获取数据:
paymentRecord 和 listApplyBase 分别从 opPaymentService 和 opRepaymentService 获取数据。
将 listApplyBase 转换为 Map:
使用 stream() 方法创建一个流。
使用 collect 方法将流中的元素收集到一个 Map 中。
Collectors.toMap 方法接受两个参数:
第一个参数是一个函数,用于生成 Map 的键。在这个例子中,我们使用 repaymentApply::getrepaymentCode 方法引用,它返回 repaymentApply 对象的 repaymentCode 字段。
第二个参数是一个函数,用于生成 Map 的值。在这个例子中,我们使用 user -> user,即将 repaymentApply 对象本身作为值。
使用 Stream API 遍历 paymentRecord 列表:
使用 stream() 方法创建一个流。
使用 filter 方法过滤出 lendCode 在 applyBaseMap 中存在的 paymentRecord 对象。
使用 forEach 方法遍历过滤后的 paymentRecord 对象,并打印匹配的 repaymentApply 对象的信息。
处理键冲突
如果 listApplyBase 中有多个 repaymentApply 对象具有相同的 repaymentCode,Collectors.toMap 方法会抛出 IllegalStateException。为了避免这种情况,可以使用 Collectors.toMap 的另一个重载方法,指定如何处理键冲突:
Java
深色版本
Map<String, repaymentApply> applyBaseMap = listApplyBase.stream()
.collect(Collectors.toMap(
repaymentApply::getrepaymentCode, // 生成Map的键
user -> user, // 生成Map的值
(existingValue, newValue) -> existingValue // 如果有冲突,保留第一个值
));
在这个例子中,如果 repaymentCode 有冲突,Map 将保留第一个遇到的 repaymentApply 对象。
通过这种方式,你可以高效地处理两个列表的匹配问题,减少不必要的循环次数。希望这些示例能帮助你解决问题。
相关文章:
java中有两个list列表,尽量少的去循环
java中有两个list列表,一个list列表是paymentRecord,另外一个list是listApplyBase,paymentRecord中的lendCode字段值跟listApplyBase中的repaymentCode字段值是对应的,用stream流去循环paymentRecord列表,然后判断当pa…...
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
在软件开发中,我们经常会遇到需要处理各种状态以及状态之间转换的场景。这些状态转换有时会变得非常复杂,特别是当涉及到多个状态,并且每个状态都有多个可能的触发事件导致不同的状态变化时。手动编写这样的逻辑不仅容易出错,而且…...
[Notes] Computer Network - Overwiew
What is the Internet? The Internet is a global network of interconnected computers that communicate using standard protocols (rules). It’s not a single entity but a network of networks that allows millions of devices worldwide to exchange data. In simp…...
MyBatisPlus——学习笔记
MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…...
运维自动化shell脚本总结
运维自动化是提升IT管理效率的关键,使用Shell脚本可以有效地实现许多日常任务的自动化。以下是一些常见的Shell脚本应用及其总结,涵盖基本概念、实用示例和最佳实践。 1. Shell脚本基础 1.1 Shell脚本定义 Shell脚本是一系列命令的集合,通…...
前端学习第三天笔记 JavaScript JavaScript的引入 数据类型 运算符 条件语句 字符串
这里写自定义目录标题 JavaScriptJavaScript引入到文件嵌入到HTML文件中引入本地独立js文件引入网络来源文件 JavaScript的注释方式嵌入在HTML文件中的注释JavaScript的输出方式数据类型原始类型(基础类型)合成类型(复合类型) 运算…...
C++教程一口气讲完!(万字讲解)( ̄y▽ ̄)╭ Ohohoho... 下
C 常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 …...
unity软件安装教程
目录 一、Unity Hub的安装 二、Unity Hub的基础设置 语言切换 安装默认路径 安装unity编辑器和visual Studio 申请许可证 创建新项目 Unity和Visual Studio进行绑定 一、Unity Hub的安装 打开浏览器输入以下网址:unity.cn,打开unity官网 点击下载&#x…...
[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠
[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠 目录 文章目录 [大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠目录0. 摘要1. 核心内容3. 创新点4. 算法模型5. 实验效果6. 重要数据与实验结论7. 推荐阅读指数:8. 推荐理由 后记 论文…...
云手机可以解决TikTok运营的哪些问题?
随着社交媒体的飞速发展,TikTok迅速崛起,成为个人和企业进行品牌宣传和内容创作的首选平台。然而,在运营TikTok账号的过程中,不少用户会遇到各种问题。本文将详细阐述云手机如何帮助解决这些问题。 1. 多账号管理的高效便捷 通过云…...
Redis基础三(redis的高级配置)
Redis进阶配置 一、Redis持久化操作 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。(Redis 数据都放在内存中。如果机器挂掉,内存的数据就不存在。所以需要做持久化,将内存中的数据保存在磁盘,…...
Telnet、SSH、RDP和VNC
Telnet、SSH、RDP和VNC都是远程访问和管理的协议或工具,它们各自具有不同的特点和适用场景。 一、基本概念与用途 Telnet 定义:一种基于命令行界面的远程管理协议,允许用户通过网络远程访问和管理计算机。用途:主要用于远程登录和…...
FiBiNET模型实现推荐算法
1. 项目简介 A031-FiBiNET模型项目是一个基于深度学习的推荐系统算法实现,旨在提升推荐系统的性能和精度。该项目的背景源于当今互联网平台中,推荐算法在电商、社交、内容分发等领域的广泛应用。推荐系统通过分析用户的历史行为和兴趣偏好,预…...
影刀RPA:Excel内容填充指令
1.实战目标 本次主要介绍影刀RPA如何操作内容相关的填充与替换指令。主要包含以下 这些指令在数据处理方面有着重要的作用,可以对数据做运算,填充,替换,实现数据格式统一,便于最终的数据分析。在操作的过程中…...
Threejs创建正多边体
上一章节实现了球体的绘制,这节来绘制多面体,包括正多面体,平面中,每条边一样长组成的图形叫正多边形,这里每个面一样,叫正多面体。如上文一样,先要创建出基础的组件,包括场景&#…...
链表——单链表
题目描述 实现一个单链表,链表初始为空,支持三种操作: (1) 向链表头插入一个数; (2) 删除第 k 个插入的数后面的数; (3) 在第 k 个插入的数后插入一个数 现在要对该链表进行 M 次操作,进行完所有操作后&am…...
【YOLO学习】YOLOv5口罩检测实战
文章目录 1. 环境配置2. 下载代码3. 安装库3.1 安装pytorch3.2 安装其他库 4. 测试5. 数据标注6. 模型训练7. 界面可视化 1. 环境配置 1. 先参考其他文章安装 Anaconda 或者 Miniconda,我安装的是 Miniconda。 2. 更换国内源,以加快速度 。可以参考下面这…...
场景题1-设计redis的key和value的原则
在设计 Redis 的 key 和 value 时,遵循一些最佳实践和设计原则可以确保系统的性能、可扩展性和易维护性。以下是设计 Redis key 和 value 时的常见原则: 1.RedisKey的设计原则 1.1.简短有意义 1)Redis 是内存数据库,key 越短&am…...
Shell-使用函数
在 Shell 脚本中,函数是由一段代码定义的,可以被重复调用。Shell 函数的定义和调用相对简单,并且它支持参数传递和返回值。错误处理在 Shell 中也非常重要,通常通过检查返回的状态码来判断是否有错误发生。 1.Shell 函数的定义和…...
Git介绍--github/gitee/gitlab使用
一、Git的介绍 1.1、学习Git的原因:资源管理 1.2、SCM软件的介绍 软件配置管理(SCM)是指通过执行版本控制、变更控制的规程,以及使用合适的配置管理软件来保证所有配置项的完整性和可跟踪性。配置管理是对工作成果的一种有效保护。 二、版本控制软件 …...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
