1. 无限流
- 无限流——这个流没有结尾,因为值是按需计算的,可以永远计算下去
public interface Stream<T> extends BaseStream<T, Stream<T>> {
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {}
public static<T> Stream<T> generate(Supplier<T> s) {}
}
2. 迭代 Stream.iterate(T seed, UnaryOperator)
2.1 生成数字序列
@Test
public void iterateDemo() {
Stream.iterate(1, n -> n + 1)
.limit(100)
.forEach(System.out::println);
// 生成 1, 2, 3 ... 100
List<Integer> numbers = Stream.iterate(1, n -> n + 1)
.limit(100)
.collect(Collectors.toList());
// 1~100 求和
Integer sum = Stream.iterate(1, n -> n + 1)
.limit(100)
.reduce(0, Integer::sum);
System.out.println(sum);
}
2.2 生成等差数列
@Test
public void evenNumber() {
// 生成偶数序列
Stream.iterate(0, n -> n + 2)
.limit(10)
.forEach(System.out::println);
}
3. 生成 Stream.generate(Supplier)
- generate(Supplier) 接受 Supplier 类型的 Lambda 提供新的值
@Test
public void generateDemo() {
// Math.random() 生成的是区间在[0,1)的随机小数
Stream.generate(() -> Math.random())
.limit(5)
.forEach(System.out::println);
// 生成 [1,10] 的整数
Stream.generate(() -> (int) (Math.random() * 10) + 1)
.limit(5)
.forEach(System.out::println);
// nextInt(10)表示区间[0,10)
Stream.generate(() -> new Random().nextInt(10) + 1)
.limit(5)
.forEach(System.out::println);
}
网友评论