将java流计数为整数,不长

hc8w905p  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(223)

我需要计算一些特殊包裹的出现次数。

Map<Integer,Integer> countBundles(){
    return bundles.stream()
        .bla()
        .bla()
        .bla()
        .collect(groupingBy(Bundle::getId), counting()));
}

此代码不编译,因为counting返回long。有什么漂亮的方法返回map<integer,integer>吗?
我有这个主意,但很难看

map.entrySet().stream()
     .collect(toMap(Map.Entry::getKey, entry -> (int) entry.getValue().longValue()));
1tuwyuhd

1tuwyuhd1#

没有内置方式可供使用 Collectors.counting()Integer ,因为泛型是不变的。但是,您可以编写一个自定义 Collector 以最小的努力:

public static <T> Collector<T, ?, Integer> countingInt() {
    return Collectors.summingInt(e -> 1);
}

你也可以用平原 summingInt(e -> 1) 如果您只想使用本机库。
例子:

Map<Integer,Integer> countBundles(){
    return bundles.stream()
        .bla()
        .bla()
        .bla()
   // 1 .collect(groupingBy(Bundle::getId), countingInt()));
   // 2 .collect(groupingBy(Bundle::getId), summingInt(e -> 1)));
}

请注意,有签名的解释,你最多可以数 2.147.483.647 元素。

hec6srdp

hec6srdp2#

你可以用 Collectors.collectingAndThen 要将函数应用于收集器的结果,请执行以下操作:

Map<Integer,Integer> countBundles() {
    return bundles.stream()
        .bla()
        .bla()
        .bla()
        .collect(groupingBy(Bundle::getId, collectingAndThen(counting(), Long::intValue)));
}

如果您需要一些其他语义而不仅仅是一个cast,请替换 Long::intValue 还有其他的转换码。

相关问题