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

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

相关推荐
咸鱼2.02 小时前
【java入门到放弃】跨域
java·开发语言
indexsunny2 小时前
互联网大厂Java求职面试实战:微服务与Spring生态全攻略
java·数据库·spring boot·安全·微服务·面试·消息队列
沐苏瑶2 小时前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
冬夜戏雪3 小时前
实习面经记录(十)
java·前端·javascript
skiy3 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
一念春风3 小时前
智能文字识别工具(AI)
开发语言·c#·wpf
平生不喜凡桃李3 小时前
浅谈 Linux 中 namespace 相关系统调用
java·linux·服务器
zb200641203 小时前
CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现
java·后端·spring
2401_895521343 小时前
spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter
java·人工智能·spring
桦03 小时前
【C++复习】:继承
开发语言·c++