如何使用Java Stream按除以指定除数的余数分组元素并实现求和?代码错误排查
问题分析:按余数分组求和的代码问题
嘿,我来帮你看看这段代码的问题在哪~首先先明确你的需求:把IntStream里的元素按除以指定除数的余数分组,然后对每组的元素求和,比如传入除数3和元素1、2、3、4、5时,余数0的组对应元素3,和为3;余数1的组对应元素1、4,和为5;余数2的组对应元素2、5,和为7,最终返回包含这些键值对的Map。
现在来看你写的代码里的两个关键问题:
- 拼写错误:方法参数里的
devisor是拼写错误,正确的应该是divisor——虽然这可能只是笔误,但会影响代码的可读性和规范性。 - 下游收集器参数缺失:
Collectors.summingInt()是不完整的,这个方法必须接收一个ToIntFunction类型的参数,用来指定要对哪个值求和。因为我们要直接对分组后的每个int元素本身求和,所以需要传入s -> s(或者更简洁的Integer::intValue,不过因为是IntStream,元素本身就是int,用s -> s会更直观)。
另外还有一个可选的健壮性优化:如果传入的除数是0,执行s % divisor会抛出ArithmeticException,所以可以在方法开头加一个校验逻辑,避免出现运行时异常。
修正后的完整代码如下:
public Map<Integer, Integer> sumByRemainder(Integer divisor, IntStream is) { // 可选:添加除数非0的校验,避免运行时异常 if (divisor == 0) { throw new IllegalArgumentException("除数不能为0"); } Map<Integer, Integer> map = is.collect( Collectors.groupingBy( s -> s % divisor, Collectors.summingInt(s -> s) ) ); return map; }
测试你提到的场景:调用sumByRemainder(3, IntStream.of(1,2,3,4,5)),返回的Map就是{0=3, 1=5, 2=7},完全符合你的预期。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

