当您添加lambda 标记时,我想您对Java-8 解决方案没问题。请注意,您的matchedList1 和unmatchedList1 包含list1 中的所有元素,因此您实际上需要根据list2 中具有相同元素的谓词对list1 进行分区。这可以使用partitioningBy 收集器来完成:
Map<Boolean, List<ClassA>> map1 = list1.stream().collect(
Collectors.partitioningBy(e1 -> list2.stream().anyMatch(
e2 -> e1.name.equals(e2.name))));
List<ClassA> matchedList1 = map1.get(true);
List<ClassA> unmatchedList1 = map1.get(false);
您可以完全相同的方式创建matchedList2 和unmatchedList2:
Map<Boolean, List<ClassA>> map2 = list2.stream().collect(
Collectors.partitioningBy(e2 -> list1.stream().anyMatch(
e1 -> e1.name.equals(e2.name))));
List<ClassA> matchedList2 = map2.get(true);
List<ClassA> unmatchedList2 = map2.get(false);
请注意,此解决方案效率不高:其复杂度为O(list1.size()*list2.size())。如果您担心效率,最好先在两个列表中构建名称集。
或者,如果您的列表按 name 字段预先排序,您可以使用二分搜索来加快该过程:
Comparator<ClassA> comparator = Comparator.comparing(e -> e.name);
Map<Boolean, List<ClassA>> map1 = list1.stream().collect(
Collectors.partitioningBy(e1 -> Collections.binarySearch(list2, e1, comparator) >= 0));
List<ClassA> matchedList1 = map1.get(true);
List<ClassA> unmatchedList1 = map1.get(false);
Map<Boolean, List<ClassA>> map2 = list2.stream().collect(
Collectors.partitioningBy(e2 -> Collections.binarySearch(list1, e2, comparator) >= 0));
List<ClassA> matchedList2 = map2.get(true);
List<ClassA> unmatchedList2 = map2.get(false);