クラスObjがあるとします
class Obj{
int field;
}
Obj
インスタンスのリスト、つまりList<Obj> lst
があること。
さて、Java8で、フィルタリング基準の下のリストfield
のオブジェクトからのintフィールドlst
の値の合計をストリームで見つけるにはどうすればよいですか(例えば、オブジェクトo
の場合、基準はo.field > 10
)?
できるよ
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();
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 = lst.stream().filter(o -> o.field > 10).mapToInt(o -> o.field).sum();
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();