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

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

相关推荐
瑞雪兆丰年兮8 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客8 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
Rain的Java大神之路8 小时前
你背的Spring答案,全是5.x时代的:7.0.8源码一翻,80%的博客都过时了
java·后端·面试
三雷科技9 小时前
第6章第4节:自定义分词器
开发语言·c#
这个昵称不容易9 小时前
考试报名系统的设计与实现(SpringBoot + MySQL + Vue 三角色平台)
java·springboot·毕设
Adellle9 小时前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
Delightrs10 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
特立独行的猫A10 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
Lonely丶墨轩10 小时前
从一个 404 到负数 ID:第三方接口开发中的几次排错
java
云上工程笔记10 小时前
SRT字幕一键转手绘动画:srt-whiteboard-animation的复刻实录
大数据·开发语言·javascript·人工智能·机器学习