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

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

相关推荐
171320330计算机毕设编程1 分钟前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
Web极客码1 分钟前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
badhope14 分钟前
Spring AI Alibaba停更:Java程序员的信任,还能被辜负几次?
java·spring
const_qiu21 分钟前
第一章 1.1-1.2:基础模型调用与 TypeScript 入门 —— Java 开发者的视角
java·javascript·typescript
Wang's Blog26 分钟前
Java 项目实战: 交友项目 - Dubbo 负载均衡策略与实战验证
java·dubbo·交友
SL_staff31 分钟前
销售知识库7天落地实践:面向业务侧的零代码嵌入方案
java·开源·产品
kimnoic33 分钟前
PHP 8.2的DNF类型怎么用才规范
开发语言·php
GreatSQL社区40 分钟前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法
_Evan_Yao1 小时前
前后端联调怎么排查问题?从 Network 到后端日志,一步步定位错误
开发语言·后端·团队开发·需求分析
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 入门案例:服务提供者搭建总结
java·交友