2017-10-07 120 views
3

如何使用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通过接口(如列表)取代,也将工作?

回答

3

使用此为您收集:

Collectors.groupingBy(Object::getClass, Collectors.counting()) 

(尽管结果地图的值类型为Long,而不是Integer

+0

“Collectors.counting()”映射到“Long”这一事实背后的原因是什么?特别是当'Collection.size()'返回一个'int'时? – hotzst

+1

@hotzst流不一定来自集合,可能比集合有更多的元素。 –

3

你有正确的想法,你只是缺少应用收集器(counting,在这种情况下)各组:

​​