ストリームを使用するJava8では、実際には非常に簡単です。編集:ストリームなしで効率的にすることができます、以下を参照してください。
List<String> listA = Arrays.asList("2009-05-18","2009-05-19","2009-05-21");
List<String> listB = Arrays.asList("2009-05-18","2009-05-18","2009-05-19","2009-05-19",
"2009-05-20","2009-05-21","2009-05-21","2009-05-22");
List<String> result = listB.stream()
.filter(not(new HashSet<>(listA)::contains))
.collect(Collectors.toList());
ハッシュセットは一度だけ作成されることに注意してください。メソッド参照はそのcontainsメソッドに関連付けられています。ラムダで同じことを行うには、変数にセットを含める必要があります。変数を作成することは悪い考えではありません。特に、見苦しい、または理解しにくい場合はそうです。
否定メソッド参照を直接呼び出すことはできないため、このユーティリティメソッド(または明示的なキャスト)のようなものがないと、述語を簡単に否定することはできません(最初に型推論が必要です)。
private static <T> Predicate<T> not(Predicate<T> predicate) {
return predicate.negate();
}
ストリームにfilterOut
メソッドなどがあると、見栄えが良くなります。
また、@ Holgerは私にアイデアをくれました。複数の削除に最適化されArrayList
たremoveAll
メソッドがあり、要素を1回だけ再配置します。ただし、contains
指定されたコレクションによって提供される方法を使用するためlistA
、小さい場合はその部分を最適化する必要があります。
listA
し、listB
以前に宣言され、このソリューションは、Java 8を必要とせず、それは非常に効率的です。
List<String> result = new ArrayList(listB);
result.removeAll(new HashSet<>(listA));