先日、リスト要素の重複チェックに、なるほど唸ってしまったものを方法を見つけました。
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;
メソッドを定義するのが嫌なら、このようになるのかな。