当前位置: 首页 > article >正文

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

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


http://www.kler.cn/news/329781.html

相关文章:

  • 模版and初识vector
  • windows系统电脑上scrcpy源码本地调试
  • Java基础——十二、容器
  • 5G NR物理信号
  • git push 远程仓库 linux版
  • 爬虫——爬虫理论+request模块
  • 【Linux】进程周边之优先级
  • 陶建辉先生荣获 2024 年“中国计算机学会(CCF)杰出工程师奖”
  • Harbor系列之12:对接外部redis和pg数据库的harbor容器化部署
  • C++:采用模板封装顺序表,栈,队列
  • 秋招内推2025--招联金融
  • 【MySQL】聚合函数、group by子句
  • Vue 常用的指令用法
  • “大数据+高职”:VR虚拟仿真实训室的发展前景
  • 2、Objects类(为什么重写 equals方法必须重写 hashCode方法)、无序性+随机性+不可重复性的区别
  • Android Studio 占满C盘快速解决方法
  • Matlab|考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度
  • 《向量数据库指南》——非结构化数据挑战升级:如何高效导入向量数据库?
  • Android 开发每日定时任务
  • Elasticsearch 使用误区之六——富文本内容写入前不清洗
  • Host文件及switchhosts for mac下载
  • vue3打包疯狂报错
  • 域内用户名枚举 实验
  • 计算机网络的整体认识---网络协议,网络传输过程
  • 媒体专访 | 探寻国家级农业产业化重点龙头企业九三食品的数字化转型破局之路
  • 如何让虚拟机与本地电脑使用同一个ip
  • 基于安卓开发大型体育场管理系统的设计与实现(源码+定制+讲解)
  • 服务器虚拟化软件介绍
  • 【C++掌中宝】从std的角度来进一步了解命名空间
  • AndroidStudio导入so文件