如何使用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
,当df %>%
rowwise() %>%
mutate(vote_share = sum(gov1vote, gov2vote, gov3vote, na.rm = T))
被接口替换时(例如List)?
答案 0 :(得分:3)
您有正确的想法,您只是缺少将收集器(在本例中为counting
)应用于每个组:
Map<Class<?>, Long> counts =
workshops.stream()
.collect(Collectors.groupingBy(Object::getClass,
Collectors.counting()));
答案 1 :(得分:3)
将此作为收藏家:
Collectors.groupingBy(Object::getClass, Collectors.counting())
(虽然结果地图的值类型为Long
,但不是Integer
)