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

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

相关推荐
smileNicky11 分钟前
布隆过滤器怎么提高误差率
java
それども13 分钟前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
Java面试题总结25 分钟前
基于 Java 的 PDF 文本水印实现方案(iText7 示例)
java·python·pdf
马猴烧酒.37 分钟前
【面试八股|Java集合】Java集合常考面试题详解
java·开发语言·python·面试·八股
以卿a44 分钟前
C++(继承)
开发语言·c++·算法
lly2024061 小时前
XQuery 选择和过滤
开发语言
测试工程师成长之路1 小时前
Serenity BDD 框架:Java + Selenium 全面指南(2026 最新)
java·开发语言·selenium
lang201509281 小时前
Java JSON绑定API:JSR 367详解
java·java-ee
czxyvX1 小时前
017-AVL树(C++实现)
开发语言·数据结构·c++
eWidget1 小时前
随机森林原理:集成学习思想 —— Java 实现多棵决策树投票机制
java·数据库·随机森林·集成学习·金仓数据库