Group8通过Collector.summarizingInt()实现Java 8流

时间:2019-07-06 12:59:01

标签: java java-8 group-by java-stream

我对运行此代码有疑问。

private void groupingByMethod(final List<Integer>values){
    //I THOUGHT THAT e was a List but is a int already  
    final ToIntFunction<Integer>summingFunction = e->{
        return e;
    };
    values.stream()
            .collect(Collectors.groupingBy(Function.identity(),Collectors.mapping(Function.identity(),Collectors.summarizingInt(summingFunction))))
            .forEach((a,b)->System.out.println(a+" "+b));
}

如果我正在测试此代码和数据。

private final List<Integer>data = Arrays.asList(3,3,1,2,4);

我得到了我期望的数据。

1 IntSummaryStatistics{count=1, sum=1, min=1, average=1,000000, max=1}
2 IntSummaryStatistics{count=1, sum=2, min=2, average=2,000000, max=2}
3 IntSummaryStatistics{count=2, sum=6, min=3, average=3,000000, max=3}
4 IntSummaryStatistics{count=1, sum=4, min=4, average=4,000000, max=4}

当然,在我的代码中,我使用的是嵌套的Collectors.collectingAndThen,但相同。是为了使代码更简单。

所以一切都像魔咒一样工作,那是什么问题呢?

我的问题是参数

 Collectors.summarizingInt(summingFunction)

我知道Collectors.summarizingInt期望一个 toIntFunction ,所以这个值从哪里来,我也知道Array的大小,所以java如何知道我期望这个值?我期望将List值用作参数,所以我可以做一个简单的 List :: size ,因此对于我的组生成List来说,这更容易理解,因此列表本身作为参数传递,您可以想要,但已经是 .size()

有人可以指导我做这些事情吗?也许不是list.size()吗?如果可以的话,如何计算计数值?

0 个答案:

没有答案