You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream API断言ClassA与ClassB列表对象的全字段匹配

用Java Stream API实现跨对象多字段匹配验证

需求说明

现有两个JSON列表:

  • 列表1包含2个ClassA类型对象
  • 列表2包含4个ClassB类型对象

需要验证列表1的首个对象是否与列表2中至少一个对象的fromPartyId(字符串类型)和fromType(PartyType枚举类型)两个字段完全匹配,要求用Java Stream API实现。

实体类定义

// PartyType枚举
public enum PartyType {
    INDIVIDUAL, ORGANIZATION;
}

// ClassA类
public class ClassA {
    private String fromPartyId;
    private PartyType fromType;

    // 构造器、getter、toString
    public ClassA(String fromPartyId, PartyType fromType) {
        this.fromPartyId = fromPartyId;
        this.fromType = fromType;
    }

    public String getFromPartyId() {
        return fromPartyId;
    }

    public PartyType getFromType() {
        return fromType;
    }

    @Override
    public String toString() {
        return "ClassA{" +
                "fromPartyId='" + fromPartyId + '\'' +
                ", fromType=" + fromType +
                '}';
    }
}

// ClassB类
public class ClassB {
    private String fromPartyId;
    private PartyType fromType;

    // 构造器、getter、toString
    public ClassB(String fromPartyId, PartyType fromType) {
        this.fromPartyId = fromPartyId;
        this.fromType = fromType;
    }

    public String getFromPartyId() {
        return fromPartyId;
    }

    public PartyType getFromType() {
        return fromType;
    }

    @Override
    public String toString() {
        return "ClassB{" +
                "fromPartyId='" + fromPartyId + '\'' +
                ", fromType=" + fromType +
                '}';
    }
}

示例JSON数据

列表1(ClassA数组):

[
  {"fromPartyId": "P1001", "fromType": "INDIVIDUAL"},
  {"fromPartyId": "P1002", "fromType": "ORGANIZATION"}
]

列表2(ClassB数组):

[
  {"fromPartyId": "P2001", "fromType": "INDIVIDUAL"},
  {"fromPartyId": "P1001", "fromType": "INDIVIDUAL"},
  {"fromPartyId": "P2003", "fromType": "ORGANIZATION"},
  {"fromPartyId": "P1002", "fromType": "INDIVIDUAL"}
]

Stream API实现方案

核心通过anyMatch()方法同时校验两个字段的匹配情况:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Arrays;
import java.util.List;

public class MatchValidation {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // 模拟从JSON解析得到的列表
        String classAJson = "[{\"fromPartyId\":\"P1001\",\"fromType\":\"INDIVIDUAL\"},{\"fromPartyId\":\"P1002\",\"fromType\":\"ORGANIZATION\"}]";
        List<ClassA> classAList = Arrays.asList(mapper.readValue(classAJson, ClassA[].class));

        String classBJson = "[{\"fromPartyId\":\"P2001\",\"fromType\":\"INDIVIDUAL\"},{\"fromPartyId\":\"P1001\",\"fromType\":\"INDIVIDUAL\"},{\"fromPartyId\":\"P2003\",\"fromType\":\"ORGANIZATION\"},{\"fromPartyId\":\"P1002\",\"fromType\":\"INDIVIDUAL\"}]";
        List<ClassB> classBList = Arrays.asList(mapper.readValue(classBJson, ClassB[].class));

        // 校验逻辑:取classAList的第一个对象,在classBList中匹配双字段
        if (!classAList.isEmpty()) {
            ClassA firstClassA = classAList.get(0);
            boolean isMatched = classBList.stream()
                    .anyMatch(classB -> 
                            firstClassA.getFromPartyId().equals(classB.getFromPartyId()) &&
                            firstClassA.getFromType() == classB.getFromType() // 枚举为单例,可直接用==比较,也能用equals
                    );

            System.out.println("是否匹配成功:" + isMatched);
        } else {
            System.out.println("ClassA列表为空,无法进行匹配");
        }
    }
}

代码说明

  1. 先判断classAList是否为空,避免空指针异常
  2. 获取列表1的首个ClassA对象
  3. 通过classBList.stream().anyMatch()遍历列表2,同时校验fromPartyId字符串相等(用equals())和fromType枚举匹配
  4. anyMatch()会在找到第一个匹配项后立即终止遍历,性能高效

扩展优化

如果需要多次进行这类多字段匹配,可以定义共同接口提取匹配字段,简化逻辑:

// 定义接口提取匹配字段
public interface PartyInfo {
    String getFromPartyId();
    PartyType getFromType();
}

// 让ClassA和ClassB实现该接口
public class ClassA implements PartyInfo { /* ... */ }
public class ClassB implements PartyInfo { /* ... */ }

// 匹配逻辑简化为:
boolean isMatched = classBList.stream()
        .anyMatch(classB -> 
                firstClassA.getFromPartyId().equals(classB.getFromPartyId()) &&
                firstClassA.getFromType().equals(classB.getFromType())
        );

内容的提问来源于stack exchange,提问作者Kuldeep Yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:37:30