Java如何用Lambda替换嵌套for循环统计isX为true的总次数
原Lambda实现的核心问题
- 流源头不匹配:代码里的变量
a根本没和业务中的exampleList绑定,第一层遍历的实际元素类型是Example,不是Arrs[]数组,直接调Arrays.stream()会直接编译报错 - 缺少扁平化处理:每个
Example内部嵌了Arrs[]数组,需要用flatMap把分散在各个数组里的Arrs元素拆成连续的单元素流,不能直接对单元素做流操作 - 结果收集逻辑缺失:如果单独给每个数组调
count(),拿到的是每个分组的独立计数值,组成的是Stream<Long>类型的分组结果流,没把所有分组的计数加总成最终的总统计值,代码里写的Stream<Object>类型也和实际返回值对不上
修正后的实现代码
和原嵌套for循环逻辑完全等价的Stream写法如下:
// 直接统计所有Arrs实例中isX为true的总次数,返回值为long类型,匹配count()方法的原生返回类型 long totalIsXCount = exampleList.stream() // 遍历每个Example,拿它内部的Arrs数组,把数组转成元素流后做扁平化拼接 .flatMap(example -> Arrays.stream(example.getArrs())) // 只保留isX属性为true的Arrs实例 .filter(Arrs::isX) // 统计流里符合条件的元素总数 .count();
如果要兼容原代码里的int类型计数,要么对最终结果做类型强转,要么用分组累加的写法:
int count = exampleList.stream() // 逐个算单个Example下符合条件的Arrs数量 .mapToInt(example -> (int) Arrays.stream(example.getArrs()) .filter(Arrs::isX) .count()) // 把所有分组的计数累加得到总结果 .sum();
这种写法的执行逻辑和原嵌套for循环完全一致,没有额外性能损耗,代码结构也更简洁。
内容的提问来源于stack exchange,提问作者harry-potter
相关产品推荐
相关产品推荐

