複数の集約として、Java 8ストリーム群

実用的:

私はいくつかのフィールドにグループに私のストリームと集約をしようとしています

すなわち

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)

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=375007&siteId=1