【lris.commons】数组数据统计器Counter

  ListMapDeal是之前xqq.commons项目中经常用到的统计工具,其能对一个List内的数据进行出现次数的统计,将其以Map<参数,出现次数>的形式返回,也可以对结果再进行排序,输出List<Entry<参数,出现次数>>这样的数据格式。

  其所实现的功能很简单,但代码实现上可能会有点繁琐,需要新建一个map,然后遍历list,然后判断map中有没有出现,没有的话赋值1,有的话加1然后重新赋值。

  Counter作为ListMapDeal的重构,利用流的遍历能将代码写的很优美。

  需要实现的功能:

  (1)将List统计为Map

  (2)将List统计为List<Entry>

 

方法(1)

  public Map<?, Long>countListAsMap(List<?> list) { 
    return list.parallelStream().collect(Collectors.groupingBy(a1 -> a1, Collectors.counting()));
  }

  先将list转换成stream,然后调用collect方法逐个收集,collect有两种传参方式,这里使用了传入Collector的方式,Collector可以直接调用Collectors的现成方法获得,其中groupingBy方法获得就是符合需求能满足的Collector。

  groupingBy根据参数有几种不同的方法,其中一种需要传入一个Function用于标注统计的key,也就是代码中的通过 a1->a1生成的部分,第二个参数需要传入另一个Collector用于对分类结果再进行统计,这里传入Collectors.counting()方法即是对其进行统计了。

 

方法(2)

   public List<Map.Entry<?, Long>> countListAndSort(List<?> list) {
        return countListAsMap(list).entrySet().parallelStream().sorted((a1, a2) -> (int) (a2.getValue() - a1.getValue())).collect(Collectors.toList());
    }

  方法2也是比较简单,首先通过方法1获得统计值,然后再转换成流,然后用sorted方法进行比较,然后收集就行了。

 

posted @ 2018-10-18 20:14  calll_me_gaga  阅读(251)  评论(0编辑  收藏  举报