まず、リストごとに 1 つずつ、2 つのマップを作成し、名前をオブジェクトにマッピングします。次に、キーセット間の違いを繰り返し処理し、その名前を持つオブジェクトの種類を処理します。マップを使用すると、リストをスキャンしてその名前のオブジェクトを探す必要がなくなります。(Multimap ではなく Map を使用する場合、各リスト内で名前が一意であるという別の回答に対する質問者のコメントに依存しています。まだ 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));
リストまたはオブジェクトのセットを正確に 1 つのリストに作成するだけで、オブジェクトをコレクションに追加するだけ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())