実用的:
私はいくつかのフィールドにグループに私のストリームと集約をしようとしています
すなわち
private class Row {
private String sku;
private int colA; // sum
private int colB; // sum
private int colC; // avg
}
例
sku colA colB colC
---------------------------
ar5sg5h 4 3 4
sd6ad6d 2 5 3
ar5sg5h 6 5 6
sd6ad6d 5 6 3
sd6ad6d 3 7 3
予想:
sku colA colB colC
---------------------------
ar5sg5h 10 8 5.0
sd6ad6d 10 18 3.0
私はすでにList<Row> rows
、私は意志持っている場合は、減らすと行をGROUPBYと集約 COLCの平均としてコーラCOLBの和のを。
どのように私はこれを達成することができGROUPBY + 複数の 集約使用したJava-8 ストリームを?
YCF_L:
あなたが探しています:
List<Row> result = rows.stream()
.collect(Collectors.groupingBy(Row::getSku))
.values().stream()
.map(e -> new Row(e.get(0).getSku(),
e.stream().mapToDouble(Row::getColA).sum(),
e.stream().mapToDouble(Row::getColB).sum(),
e.stream().mapToDouble(Row::getColC).average().getAsDouble()))
.collect(Collectors.toList());
注:int型は、あなたのケースで参考になっていないですが、私は平均的ではないとして倍増することを変更することをお勧めint
。
アウトプット
Row(sku=sd6ad6d, colA=10.0, colB=18.0, colC=3.0)
Row(sku=ar5sg5h, colA=10.0, colB=8.0, colC=5.0)