Java Stream按整数位数分组Map 实现值前缀添加与负数过滤
整数按位数分组的Stream实现方案
原有代码未覆盖过滤规则、类型转换、前缀拼接三个要求,可通过调整流处理逻辑+groupingBy下游收集器实现需求,具体实现如下。
正确代码
import java.util.List; import java.util.Map; import java.util.stream.Collectors; public static Map<Integer, List<String>> groupByDigitNumbers(List<Integer> x){ return x.stream() // 过滤所有负整数 .filter(num -> num >= 0) .collect(Collectors.groupingBy( // 分组键:原整数的数字位数 num -> Integer.toString(num).length(), // 下游收集:转换为带奇偶前缀的字符串后收集为列表 Collectors.mapping( num -> (num % 2 == 0 ? "e" : "o") + num, Collectors.toList() ) )); }
逻辑说明
- 第一步通过
filter操作直接剔除所有负整数,避免后续无效计算 - 分组键直接取原整数转字符串后的长度,避免前缀拼接后长度计算错误
- 借助
Collectors.mapping作为groupingBy的下游收集器,在分组阶段直接完成整数到目标字符串的转换,直接得到List<String>类型的value,无需额外遍历转换 - 奇偶判断通过取模运算实现:偶数拼接
e前缀,奇数拼接o前缀
效果验证
传入示例输入[17,2,44,183,4]时,处理逻辑如下:
- 17:奇数、2位 → 生成
o17,归入key=2的分组 - 2:偶数、1位 → 生成
e2,归入key=1的分组 - 44:偶数、2位 → 生成
e44,归入key=2的分组 - 183:奇数、3位 → 生成
o183,归入key=3的分组 - 4:偶数、1位 → 生成
e4,归入key=1的分组
最终输出和预期完全一致:{1: ["e2", "e4"], 2: ["o17", "e44"], 3: ["o183"]}
内容的提问来源于stack exchange,提问作者ReallyNicePerson
相关产品推荐
相关产品推荐

