按类型计算元素

时间:2017-10-07 18:39:46

标签: java java-stream

如何使用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)?

2 个答案:

答案 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