如何用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列表为空,无法进行匹配"); } } }
代码说明
- 先判断
classAList是否为空,避免空指针异常 - 获取列表1的首个
ClassA对象 - 通过
classBList.stream().anyMatch()遍历列表2,同时校验fromPartyId字符串相等(用equals())和fromType枚举匹配 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
相关产品推荐
相关产品推荐

