2017-10-07 86 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,在這種情況下)各組:

​​