1. 概述

在实际开发中,我们经常会遇到需要生成某个数值区间内所有整数的场景,比如用于初始化测试数据、构建索引列表等。本文将介绍几种在 Java 中生成指定范围内数字序列的常用方法,从传统循环到现代 Stream API,帮助你在不同场景下做出合适选择。

2. 生成范围内的数字序列

2.1. 传统 for 循环 ✅

最直观、兼容性最好的方式就是使用 for 循环。这种方式逻辑清晰,适合对性能要求高或运行环境受限(如低版本 JVM)的项目。

public List<Integer> getNumbersInRange(int start, int end) {
    List<Integer> result = new ArrayList<>();
    for (int i = start; i < end; i++) {
        result.add(i);
    }
    return result;
}

📌 说明

  • 范围是 [start, end),即包含 start,不包含 end
  • 简单粗暴,无额外依赖,适合嵌入性能敏感代码块
  • 缺点是代码略显冗长,不够函数式

⚠️ 踩坑提醒:注意边界条件,尤其是 start >= end 的情况,建议在方法入口加校验避免空循环或异常。


2.2. 使用 JDK 8 IntStream.range ✅

Java 8 引入了 IntStream,提供了更简洁的函数式写法。IntStream.range() 可以直接生成一个左闭右开的整数流。

public List<Integer> getNumbersUsingIntStreamRange(int start, int end) {
    return IntStream.range(start, end)
      .boxed()
      .collect(Collectors.toList());
}

📌 关键点

  • IntStream.range(start, end):生成 [start, end) 的 int 流
  • .boxed():将原始类型 int 装箱为 Integer
  • .collect(Collectors.toList()):收集为 List<Integer>

💡 优势

  • 代码简洁,语义清晰
  • 属于标准库,无需引入第三方依赖
  • 支持链式操作,便于后续扩展(如过滤、映射)

2.3. 使用 IntStream.rangeClosed ✅

如果需要包含 end 值(即闭区间),可以使用 rangeClosed 方法。

public List<Integer> getNumbersUsingIntStreamRangeClosed(int start, int end) {
    return IntStream.rangeClosed(start, end)
      .boxed()
      .collect(Collectors.toList());
}

📌 对比: | 方法 | 区间类型 | 示例 range(1, 3) 结果 | |------|----------|------------------------| | IntStream.range | [start, end) | [1, 2] | | IntStream.rangeClosed | [start, end] | [1, 2, 3] |

✅ 推荐在需要包含上限时使用 rangeClosed,避免手动 end + 1 这种容易出错的操作。


2.4. 使用 IntStream.iterate ❗

当你不关心具体范围,而是知道需要生成多少个连续数字时,iterate 更加灵活。

public List<Integer> getNumbersUsingIntStreamIterate(int start, int limit) {
    return IntStream.iterate(start, i -> i + 1)
      .limit(limit)
      .boxed()
      .collect(Collectors.toList());
}

📌 参数说明

  • start:起始值
  • i -> i + 1:迭代函数,定义如何生成下一个值
  • limit(limit):限制生成元素个数

🌰 示例

getNumbersUsingIntStreamIterate(5, 3); // 输出 [5, 6, 7]

⚠️ 注意

  • iterate 生成的是无限流,必须配合 limit 使用,否则会 OOM
  • 性能略低于 range,因为缺少内部优化
  • 适合非等差或复杂递推场景(如斐波那契)

3. 总结

方法 是否包含 end 是否推荐 适用场景
for loop 兼容性要求高、性能敏感
IntStream.range ✅✅✅ 日常开发首选
IntStream.rangeClosed ✅✅✅ 明确需要包含 end
IntStream.iterate 灵活控制 ⚠️ 固定数量或复杂序列

推荐实践

  • 多数情况下优先使用 IntStream.rangerangeClosed
  • 保持代码简洁性和可读性
  • 注意边界处理和空输入防御

所有示例代码已托管至 GitHub:https://github.com/tech-tutorial-examples/java-number-range


原始标题:Listing Numbers Within a Range in Java