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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:57:35