web-dev-qa-db-ja.com

カスタムオブジェクトのリストがJava 8

Java 8.は初めてです。タイプAのカスタムオブジェクトのリストがあります。ここで、Aは次のようなものです。

 class A {
      int id;
      String name;
 }

リスト内のすべてのオブジェクトが同じ名前であるかどうかを確認したいと思います。リストを反復処理して、名前の以前の値と現在の値を取得することで、これを行うことができます。そのコンテキストで、私は 属性の1つに同じ値を持つリスト内のカスタムオブジェクトの数を数える方法 を見つけました。しかし、ストリームを使用してJava 8で同じことを行うより良い方法はありますか?

14
Joy

1つの方法は、最初のリストの名前を取得してallMatchを呼び出し、それを確認することです。

String firstName = yourListOfAs.get(0).name;
boolean allSameName = yourListOfAs.stream().allMatch(x -> x.name.equals(firstName));
9
Sweeper

mapからAStringからdistinct中間演算を適用し、limit(2)を利用して最適化を有効にし、countが_1_以下かどうかを確認できます。同じ名前であり、そうでない場合、すべてが同じ名前であるとは限りません。

_boolean result = myList.stream()
                       .map(A::getName)
                       .distinct()
                       .limit(2)
                       .count() <= 1;
_

上記の例では、limit(2)操作を利用して、2つの異なるオブジェクト名が見つかるとすぐに停止します。

16
Ousmane D.

別の方法は、次を使用して個別の名前の数を計算することです

boolean result = myList.stream().map(A::getName).distinct().count() == 1;

もちろん 'name'フィールドにゲッターを追加する必要があります

1
Alex M981

または、groupingByを使用してから、entrySetサイズを確認します。

boolean b  = list.stream()
             .collect(Collectors.groupingBy(A::getName, 
             Collectors.toList())).entrySet().size() == 1;
0
Hadi J

Partitioningを使用したもう1つのオプション。パーティショニングは特別な種類のグループ化であり、結果のマップには最大で2つの異なるグループが含まれます。1つはtrue、もう1つはfalseです。

これにより、一致する数と一致しない数を取得できます

String firstName = yourListOfAs.get(0).name;

Map<Boolean, List<Employee>> partitioned =  employees.stream().collect(partitioningBy(e -> e.name==firstName));

Java 9 takeWhileを使用 takewhileは、述語がfalseを返すまですべての値を取得します。これは、whileループのbreakステートメントに似ています

String firstName = yourListOfAs.get(0).name;        

        List<Employee> filterList =  employees.stream()
                                               .takeWhile(e->firstName.equals(e.name)).collect(Collectors.toList());
        if(filterList.size()==list.size())
        {
            //all objects have same values 
        }
0
Niraj Sonawane