如何使用单条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
相关产品推荐
相关产品推荐

