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的写法更贴合这个场景:
- 第一个参数指定Map的key为
type字段,和groupingBy的效果一致 - 第二个参数把每条Operator数据转成初始计数的Result
- 第三个参数处理同一个type下多条数据的合并逻辑,把对应计数累加,最终得到每个type的总统计结果
内容的提问来源于stack exchange,提问作者user5669842
相关产品推荐
相关产品推荐

