日々常々

ふつうのプログラマがあたりまえにしたいこと。

リストを項目ごとに集計する - Java8ばーじょん

4年前に書いたリストを項目ごとに集計するというエントリを見つけたので、なんとなく今風にStream使って書いてみた。

Collection<Output> summary(List<Input> data) {
    return data -> {
        Map<String, List<Input>> collected = data.stream()
                .collect(groupingBy(Input::getKey));
        return collected.entrySet().stream()
                .map(e -> new Output(
                        e.getKey(),
                        e.getValue().stream().mapToInt(Input::getValue).sum()))
                .collect(toList());
    };
}

……むーん。

単にMap<String, Integer>にするだけならまだ見れるんだけど。

Map<String, Integer> summary(List<Input> 
    return data.stream().collect(
            groupingBy(Input::getKey, summingInt(Input::getValue)));
}

実装力不足もあるんだけど、何でもかんでもStreamにしたらいいわけではないなーと改めて。 たぶんIntSummaryStatisticsみたいな集計オブジェクト作った上でやったほうが良さそうに思いました。

何通りか書いてみたけどイマイチだはー。