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

如何使用单条Java Stream生成4个1-6随机数并求和(排除最小值)

单条Stream实现随机数排除最小值求和的方案

完全可以把所有逻辑整合到同一条Stream调用链中,不需要拆分中间集合变量,以下是不同需求对应的实现方案:


方案1:和原实现逻辑完全等价(仅移除1个最小值)

如果你要保留的逻辑是生成列表后仅删除第一个出现的最小值,使用Collectors.collectingAndThen即可把两步操作合并到一条链中:

int sum = r.ints(4, 1, 7)
        .boxed()
        .collect(Collectors.collectingAndThen(
                Collectors.toList(),
                list -> {
                    list.remove(Collections.min(list));
                    return list.stream().mapToInt(Integer::intValue).sum();
                }
        ));

该方案完全复现你原来的实现逻辑,仅生成一次随机数,所有操作都在Stream链内完成。


方案2:仅排除1个最小值的高性能实现

如果不需要保留原始集合,只需要计算结果,可以用IntSummaryStatistics直接统计总和和最小值,不需要拆装箱也不需要额外集合开销,性能更高:

// Java 8+ 写法
IntSummaryStatistics stat = r.ints(4, 1, 7).summaryStatistics();
int sum = stat.getSum() - stat.getMin();

// 单表达式写法(Java 11+ 支持var)
var sum = r.ints(4, 1, 7).summaryStatistics().let(s -> s.getSum() - s.getMin());

该方案时间复杂度O(n),空间复杂度O(1),适合对性能有要求的场景。


方案3:排除所有等于最小值的元素

如果你的需求是移除所有和最小值相等的元素(比如生成了[1,1,2,3],两个1都会被移除),可以用如下实现:

int sum = r.ints(4, 1, 7)
        .boxed()
        .collect(Collectors.collectingAndThen(
                Collectors.toList(),
                list -> {
                    int min = Collections.min(list);
                    return list.stream().filter(v -> v != min).mapToInt(Integer::intValue).sum();
                }
        ));

内容的提问来源于stack exchange,提问作者cdpaiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:15:02