リスト要素の重複チェック

先日、リスト要素の重複チェックに、なるほど唸ってしまったものを方法を見つけました。
Java8 Streamの重複チェック (Collectorを使ってきれいに書く) - Qiita

static<T> Collector<T,?,Boolean> uniqueElements(){
    Set<T> set = new HashSet<>();
    return Collectors.reducing(true, set::add, Boolean::logicalAnd);
}

でも、これって、Java の Set の add が、オブジェクトの equals() メソッドでチェックするのだから、
equals 実装が正しくないクラスオブジェクトでこのまま、総称型のこのメソッドを使用するのは
危険だと思う。

そもそも、重複するもの抽出する例は、次のサンプルが書けます。。

List<String> list =
Arrays.asList("A", "B", "A", "C", "F", "D", "C", "C", "E", "F")
.stream()
.collect(Collectors.groupingBy(x->x, Collectors.counting()))
.entrySet().stream()
.filter(e->e.getValue() > 1)
.<String>map(e->e.getKey())
.collect(Collectors.toList());

重複カウントは次のように取得できます。

long lc =
Arrays.asList("A", "B", "A", "C", "F", "D", "C", "C", "E", "F")
.stream()
.collect(Collectors.groupingBy(x->x, Collectors.counting()))
.values().stream()
.filter(e->e > 1)
.collect(Collectors.counting());

だから、boolean にだってできます。

boolean b = Arrays.asList("A", "B", "A", "C", "F", "D", "C", "C", "E", "F")
.stream()
.collect(Collectors.groupingBy(x->x, Collectors.counting()))
.values().stream()
.filter(e->e > 1)
.collect(Collectors.counting()) > 0;

メソッドを定義するのが嫌なら、このようになるのかな。

重複存在すれば true を返すCollectors - Oboe吹きプログラマの黙示録