Java 使用Stream生成3的倍数时返回3的幂次如何解决?
你之前的代码得到3的幂次,本质是因为Stream.iterate的迭代逻辑是将上一次的计算结果作为下一次迭代的入参,你传入的迭代函数是x -> 3*x,种子初始值为1,自然每次都是前一个值乘3,得到幂次序列。另外要注意你定义的方法名是multipleOf3,调用时写的multipleDe3拼写不一致,实际运行时需要统一否则会报错。
以下是完全不依赖前一次计算结果的3的倍数生成方案:
方案1:使用IntStream.range生成(最简洁)
直接生成连续正整数序列,每个数单独乘以3得到3的倍数,每个元素的计算完全独立,和前序结果没有关联:
public static Stream<Integer> multipleOf3(){ // 生成1到10的闭区间整数,每个乘3后装箱为Integer类型 return IntStream.rangeClosed(1, 10) .map(n -> 3 * n) .boxed(); }
输出结果为3、6、9、12...30的10个连续3的倍数。
方案2:仍使用Stream.iterate调整逻辑
如果要保留iterate的写法,可以将迭代对象改为乘数,再单独做乘3的映射:
public static Stream<Integer> multipleOf3(){ // 迭代生成1、2、3...10的乘数序列,每个单独乘3得到结果 return Stream.iterate(1, n -> n + 1) .limit(10) .map(n -> 3 * n); }
方案3:Java 9+ 带终止条件的写法
如果使用Java 9及以上版本,可以给iterate直接添加终止条件,不需要单独调用limit:
public static Stream<Integer> multipleOf3(){ return IntStream.iterate(1, n -> n <= 10, n -> n + 1) .map(n -> 3 * n) .boxed(); }
内容的提问来源于stack exchange,提问作者AD3vTs4113
相关产品推荐
相关产品推荐

