static <T> Stream<T> generate(Supplier<? extends T> s)
该方法主要用于生成一个无限连续的无序流,流中的元素由用户定义的supplier函数生成。
看个简单例子:
void stream_generate() {
Stream<String> stream = Stream.generate(()->"a").limit(2);
stream.forEach(System.out::print);
}
运行结果:aa
该方法一般配合limit方法使用,在这个例子中我们使用limit方法限制这个无限流的长度为2,因此最终打印出两个a。加入我们不使用limit方法限制流长度会出现什么情况?测试一下。
Stream<String> stream = Stream.generate(()->"a");//.limit(2);
stream.forEach(System.out::print);
结果很恐怖,打印出一长串a,然后一直在执行。
我们用count方法看看能不能得出这个流的长度:
//stream.forEach(System.out::print);
System.out.print(stream.count());
结果是应用一直运行,没有打印任何信息。
上面的例子只是在流中简单的放入相同的字符,没有什么实际意义,那这个方法有什么用呢?实际上它可以用来生成一个包含随机数的流,如下例子:
Stream<Integer> stream2 = Stream.generate(new Random()::nextInt).limit(5);
stream2.forEach(System.out::println);
运行结果:
1490779967
1735632048
-1246527591
1186880909
1715655878
打印出5个随机整数。
其实如果要得到包含随机整数的流可以不用上面代码这么麻烦,Random有方法可以直接得到,看下面例子:
Stream<Integer> stream3 = new Random().ints().limit(5).boxed();
stream3.forEach(System.out::println);
执行结果:
1690093404
-1010435953
1207222452
1746228394
1492727549