java中有两个list列表,尽量少的去循环

188 篇文章 7 订阅

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值