Java8:リスト内のオブジェクトの特定のフィールドからの値の合計


82

クラスObjがあるとします

class Obj{

  int field;
}

そして、Objインスタンスのリストがあること、つまりList<Obj> lst

さて、Java8で、フィルタリング基準(たとえば、オブジェクトの場合、基準は)の下で、fieldリスト内のオブジェクトからのintフィールドの値の合計をストリームで見つけるにはどうすればよいですか?lstoo.field > 10

回答:


157

できるよ

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(o -> o.getField()).sum();

または(メソッドリファレンスを使用)

int sum = lst.stream().filter(o -> o.getField() > 10).mapToInt(Obj::getField).sum();

4
またはint sum = lst.stream().mapToInt(Obj::getField).filter(n -> n > 10).sum();
4castle 2018


6

次のcollectような適切な合計コレクターを使用することもできますCollectors#summingInt(ToIntFunction)

Collector入力要素に適用された整数値関数の合計を生成するaを返します。要素が存在しない場合、結果は0になります。

例えば

Stream<Obj> filtered = list.stream().filter(o -> o.field > 10);
int sum = filtered.collect(Collectors.summingInt(o -> o.field));


0

getField()メソッドを持つObjエンティティのJava 8では、field次のものを使用できます。

List<Obj> objs ...

Stream<Obj> notNullObjs =
  objs.stream().filter(obj -> obj.getValue() != null);

Double sum = notNullObjs.mapToDouble(Obj::getField).sum();

この答えはトピックに何を追加しますか?Indicator質問のどこにも言及はなく、すべての答えはすでに非常に具体的です。したがって、回答を編集して目前のトピックに本当に役立つものを追加できない限り、削除することをお勧めします。
オリヴィエ・グレゴワール

オリヴィエの抽象的な思考を助けるために名前を変更しました。
ゾン

0

次の方法で実行できます: "IntSummaryStatistics"

IntSummaryStatistics insum = li.stream().filter(v-> v%2==0).mapToInt(mapper->mapper).summaryStatistics();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.