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

