You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8如何用Stream按type分组统计boolean字段为true的数量生成指定Map

Java 8 Stream实现按分组统计布尔字段为true的次数

前提说明

首先需要给两个实体类补全必要的访问方法:

  • Operator 类补充字段对应的getter方法:getType()、isUpdateRequested()、isDeleteRequested()(boolean类型字段的标准getter前缀为is,如果你实际生成的是getXxx格式同步替换即可)
  • Result 类补充全参构造方法,或者无参构造+setter方法,用于实例化和赋值。

具体实现代码

推荐使用Collectors.toMap的合并逻辑实现,写法更易懂,完全兼容Java 8:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 你的业务逻辑代码段
List<Operator> operatorList = // 你的原始List集合
Map<String, Result> resultMap = operatorList.stream()
    .collect(Collectors.toMap(
        // 键:按type字段分组
        Operator::getType,
        // 值:单个Operator转换为初始Result对象,布尔为true则对应计数为1,否则为0
        operator -> new Result(
            operator.isDeleteRequested() ? 1 : 0,
            operator.isUpdateRequested() ? 1 : 0
        ),
        // 同key合并逻辑:两个Result的对应计数字段相加
        (oldRes, newRes) -> new Result(
            oldRes.getDeleteReqCount() + newRes.getDeleteReqCount(),
            oldRes.getUpdateReqCount() + newRes.getUpdateReqCount()
        )
    ));

如果你的Result只有无参构造,可以把转换和合并的部分改成setter赋值:

// 值转换部分
operator -> {
    Result res = new Result();
    res.setDeleteReqCount(operator.isDeleteRequested() ? 1 : 0);
    res.setUpdateReqCount(operator.isUpdateRequested() ? 1 : 0);
    return res;
},
// 合并部分
(oldRes, newRes) -> {
    oldRes.setDeleteReqCount(oldRes.getDeleteReqCount() + newRes.getDeleteReqCount());
    oldRes.setUpdateReqCount(oldRes.getUpdateReqCount() + newRes.getUpdateReqCount());
    return oldRes;
}

原理解释

你之前写的groupingBy也可以实现,需要搭配下游自定义收集器,不过toMap的写法更贴合这个场景:

  1. 第一个参数指定Map的key为type字段,和groupingBy的效果一致
  2. 第二个参数把每条Operator数据转成初始计数的Result
  3. 第三个参数处理同一个type下多条数据的合并逻辑,把对应计数累加,最终得到每个type的总统计结果

内容的提问来源于stack exchange,提问作者user5669842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 02:24:01