web-dev-qa-db-ja.com

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

クラスObjがあるとします

class Obj{

  int field;
}

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

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

56
mat_boy

できるよ

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();
111
Aniket Thakur

Collectors#summingInt(ToIntFunction) のような適切な加算コレクターでcollectすることもできます

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

例えば

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

あなたが試すことができます

int sum = list.stream().filter(o->o.field>10).mapToInt(o->o.field).sum();

説明のように ここ

4
Paweł Ćwik

試してください:

int sum = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
4
JeanValjean

Java 8では、ObjおよびgetField()メソッドを持つfieldエンティティに対して次を使用できます。

List<Obj> objs ...

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

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