多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### [int 类型的范围](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=int-%e7%b1%bb%e5%9e%8b%e7%9a%84%e8%8c%83%e5%9b%b4) `IntStream`类提供了`range()`方法用于生成整型序列的流。编写循环时,这个方法会更加便利: ~~~ // streams/Ranges.java import static java.util.stream.IntStream.*; public class Ranges { public static void main(String[] args) { // 传统方法: int result = 0; for (int i = 10; i < 20; i++) result += i; System.out.println(result); // for-in 循环: result = 0; for (int i : range(10, 20).toArray()) result += i; System.out.println(result); // 使用流: System.out.println(range(10, 20).sum()); } } ~~~ 输出结果: ~~~ 145 145 145 ~~~ 在主方法中的第一种方式是我们传统编写`for`循环的方式;第二种方式,我们使用`range()`创建了流并将其转化为数组,然后在`for-in`代码块中使用。但是,如果你能像第三种方法那样全程使用流是更好的。我们对范围中的数字进行求和。在流中可以很方便的使用`sum()`操作求和。 注意**IntStream.**`range()`相比`onjava.Range.range()`拥有更多的限制。这是由于其可选的第三个参数,后者允许步长大于 1,并且可以从大到小来生成。 实用小功能`repeat()`可以用来替换简单的`for`循环。代码示例: ~~~ // onjava/Repeat.java package onjava; import static java.util.stream.IntStream.*; public class Repeat { public static void repeat(int n, Runnable action) { range(0, n).forEach(i -> action.run()); } } ~~~ 其产生的循环更加清晰: ~~~ // streams/Looping.java import static onjava.Repeat.*; public class Looping { static void hi() { System.out.println("Hi!"); } public static void main(String[] args) { repeat(3, () -> System.out.println("Looping!")); repeat(2, Looping::hi); } } ~~~ 输出结果: ~~~ Looping! Looping! Looping! Hi! Hi! ~~~ 原则上,在代码中包含并解释`repeat()`并不值得。诚然它是一个相当透明的工具,但结果取决于你的团队和公司的运作方式。