package com.ruoyi.common.utils; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; public class ArrayListUtils { /** * 根据ID将两个List拆分为:仅List1独有、仅List2独有、两者共有 * * @param list1 列表1 * @param list2 列表2 * @param idExtractor ID提取函数 * @return Map包含三个Key: "onlyIn1", "onlyIn2", "common" */ public static Map> splitListsById(List list1, List list2, Function idExtractor) { // 1. 提取ID集合,用于快速判断存在性 Set ids1 = list1.stream().map(idExtractor).collect(Collectors.toSet()); Set ids2 = list2.stream().map(idExtractor).collect(Collectors.toSet()); // 2. 计算ID层面的差集和交集 Set onlyIn1Ids = new HashSet<>(ids1); onlyIn1Ids.removeAll(ids2); // List1独有的ID Set onlyIn2Ids = new HashSet<>(ids2); onlyIn2Ids.removeAll(ids1); // List2独有的ID Set commonIds = new HashSet<>(ids1); commonIds.retainAll(ids2); // 共有的ID // 3. 根据ID过滤原始对象列表 List onlyIn1 = list1.stream() .filter(item -> onlyIn1Ids.contains(idExtractor.apply(item))) .collect(Collectors.toList()); List onlyIn2 = list2.stream() .filter(item -> onlyIn2Ids.contains(idExtractor.apply(item))) .collect(Collectors.toList()); // 注意:共有部分通常合并两个列表中的元素,或者只取其中一个。 // 这里策略是:保留list1和list2中所有ID重合的对象(如果业务要求去重或合并对象属性,需额外处理) List common = new ArrayList<>(); common.addAll(list1.stream() .filter(item -> commonIds.contains(idExtractor.apply(item))) .collect(Collectors.toList())); // common.addAll(list2.stream() // .filter(item -> commonIds.contains(idExtractor.apply(item))) // .collect(Collectors.toList())); Map> result = new HashMap<>(); result.put("onlyIn1", onlyIn1); result.put("onlyIn2", onlyIn2); result.put("common", common); return result; } }