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 对象。

通过这种方式,你可以高效地处理两个列表的匹配问题,减少不必要的循环次数。希望这些示例能帮助你解决问题。

相关推荐
Marye_爱吃樱桃几秒前
MATLAB R2024b的安装、简单设置——保姆级教程
开发语言·matlab
旺仔.291几秒前
Linux系统基础详解(二)
linux·开发语言·网络
阿贵---1 分钟前
分布式系统C++实现
开发语言·c++·算法
不染尘.2 分钟前
最短路径之Bellman-Ford算法
开发语言·数据结构·c++·算法·图论
格林威3 分钟前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
xiaoye-duck5 分钟前
C++ STL set 系列深度解析:从底层原理、核心接口到实战场景
开发语言·c++·stl
小涛不学习5 分钟前
Java高频面试题(带答案版)
java·开发语言
big_rabbit05026 分钟前
JVM堆内存查看命令
java·linux·算法
m0_662577977 分钟前
C++中的RAII技术深入
开发语言·c++·算法
学习要积极14 分钟前
Springboot图片验证码-EasyCaptcha
java·spring boot·后端