首先,我们将构建两个映射,每个列表一个映射,将名称映射到对象。然后我们遍历键集之间的差异,处理具有该名称的任何类型的对象。这些地图让我们避免扫描列表以寻找具有该名称的对象。(在使用 Map 而不是 Multimap 时,我依赖提问者对另一个答案的评论,即在每个列表中,名称都是唯一的。如果您仍在使用 Java 7,请将方法引用替换为 Function 实现。)
Map<String, Object1> map1 = Maps.uniqueIndex(list1, Object1::getName);
Map<String, Object2> map2 = Maps.uniqueIndex(list2, Object1::getName);
for (String name : Sets.difference(map1.keySet(), map2.keySet()))
processObject1(map1.get(name));
for (String name : Sets.difference(map2.keySet(), map1.keySet()))
processObject2(map2.get(name));
如果您只想在一个列表中构建列表或对象集,processObject1
并且processObject2
可以将对象添加到集合中。
uniqueIndex
的迭代顺序是输入可迭代的,并difference
返回具有与其第一个参数相同的迭代顺序的 SetView,因此如果该顺序与您的问题相关,您可以按照它们在输入列表中出现的顺序处理对象。
Java 8 流提供了基本相同的功能:
Map<String, Object1> map1 = list1.stream().collect(Collectors.toMap(Function.identity(), Object1::getName));
Map<String, Object2> map2 = list2.stream().collect(Collectors.toMap(Function.identity(), Object2::getName));
map1.keySet().stream().filter(n -> !map2.keySet().contains(n)).map(map1::get).forEachOrdered(o1 -> processObject1(o1));
map2.keySet().stream().filter(n -> !map1.keySet().contains(n)).map(map2::get).forEachOrdered(o2 -> processObject1(o2));
同样,如果您只想收集对象,可以将forEachOrdered
调用替换为。collect(Collectors.toList())