按类型计算元素
问题描述:
如何使用Java Stream API将列表中的元素映射到按其类型计数的元素?按类型计算元素
没有流的例子看起来是这样的:
List<Object> list = new ArrayList<>();
list.add("Hello");
list.add(Integer.valueOf(1));
list.add("World");
list.add(Double.valueOf(4.6));
list.add(Integer.valueOf(42));
list.add(new Object());
list.add(Integer.valueOf(4711));
Map<Class<? extends Object>, Integer> map = new HashMap<>();
for (Object item : list) {
if (map.containsKey(item.getClass())) {
int count = map.get(item.getClass());
map.put(item.getClass(), count + 1);
} else {
map.put(item.getClass(), 1);
}
}
然而,在我的生产代码,它不是Object
名单,但有不同的实现的接口。
我的猜测,到目前为止是这样的:
workshops.stream().collect(Collectors.groupingBy(Object::getClass))
但我怎么能这样映射到Map<Object, Integer>
时Object
通过接口(如列表)取代,也将工作?
答
使用此为您收集:
Collectors.groupingBy(Object::getClass, Collectors.counting())
(尽管结果地图的值类型为Long
,而不是Integer
)
答
你有正确的想法,你只是缺少应用收集器(counting
,在这种情况下)各组:
“Collectors.counting()”映射到“Long”这一事实背后的原因是什么?特别是当'Collection.size()'返回一个'int'时? – hotzst
@hotzst流不一定来自集合,可能比集合有更多的元素。 –