利用jdk8 steam() foreach() 对List,Map 进行分组计数
发布时间:2019-07-03 21:19:36 阅读:436

情景

需要对List集合里中的实体 某个属性进行分类 并且计数。有点像sql里的group by 并且分组计数

费劲不费心方法

比较省心的方式就是循环if

    // 我就不放数据了
    List list = new List();
    int countA = 0;
    int countB = 0;
    ...
    for(i=0;i<list.size();i++){
        if("类别A".equals(list.get(i))){
            countA++;
        }
        if("类别B".equals(list.get(i))){
            countB++;
        }
        ...
    }

但是此类方法 会手动创建N个count变量,JAVA我只听过不定参数的用法,没听过不定变量的方法。
感觉有点鸡肋。不如采用以下方法(请自行了解一些lambda表达式基本用法)

费心不费劲方法

// 提取要分类的字段 如上文的 "类别A" 的名称
List<String> fenlei = new ArrayList();
list.forEach(entity -> fenlei.add(entity.getType()));
// 利用jdk8对List新增的stream()方法 开始分类并且计数 存到Map类型的exp变量中
Map<String, Long> exp = express.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
/* Function是jdk8 新增的函数式接口,我了解也不多,同类的还有Consumer 等 */
//  exp -> (key:分类名称 value:数量)   PS:这里不是lambda表达式

其实搜解决办法到实现不过花费我1个小时而已,感觉并不是太费心
部分内容参考: CSDN博客

发表评论
使用 Nuxt 3 构建 | 部署于 Kubernetes | 托管于 狗云
Copyright © 2020-2024 | 网站已续航 1730 天