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

如何使用Java8 Stream API查找满足累加和≥10的n值?

使用Java 8 Stream API实现累加和阈值查找

这个需求用Stream来实现的话,核心是要在遍历过程中跟踪累加和——虽然Stream本身偏向无状态操作,但我们可以用一个可变容器来保存累加状态,下面是两种贴合你需求的实现方式:

方式一:贴合原for循环逻辑(返回数组索引)

你的原代码是遍历数组索引、累加对应元素,找到第一个让总和≥10的索引。用Stream可以这么写:

int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] sumHolder = {0}; // 用数组作为可变容器,因为lambda无法修改外部基本类型变量

OptionalInt targetIndex = IntStream.range(0, arr.length)
    .peek(i -> sumHolder[0] += arr[i]) // 遍历每个索引时,累加对应元素到sumHolder
    .filter(i -> sumHolder[0] >= 10)   // 筛选出累加和满足条件的索引
    .findFirst();                      // 获取第一个满足条件的索引

if (targetIndex.isPresent()) {
    int n = targetIndex.getAsInt();
    System.out.println("满足条件的索引n:" + n); // 输出3,对应数组中第4个元素(1+2+3+4=10)
}

方式二:直接针对数字序列(返回目标数字n)

如果你的需求是找到最小的数字n(而非数组索引),使得1+2+…+n≥10,那可以直接生成1到9的数字流,逻辑更直观:

int[] sumHolder = {0};

OptionalInt targetNum = IntStream.rangeClosed(1, 9)
    .peek(num -> sumHolder[0] += num)
    .filter(num -> sumHolder[0] >= 10)
    .findFirst();

if (targetNum.isPresent()) {
    int n = targetNum.getAsInt();
    System.out.println("满足条件的最小n:" + n); // 输出4,因为1+2+3+4=10
}

注意事项

  • 这里用int[] sumHolder作为可变容器是因为Java的lambda表达式无法修改外部的基本类型变量(会被视为effectively final),数组是引用类型,可以在lambda内部修改其元素值。
  • 这种实现不能用并行流(parallel()),因为多个线程同时修改sumHolder会导致线程安全问题,而我们的需求是找第一个满足条件的元素,串行流完全足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:56:38