??流是惰性的,分为中间操作和终止操作,在执行终止操作之前,流的遍历不会开始,基于这一特性,才可以使用无限流;
??使用无限流,需要正确的做限制(limit),截断流。
/**
* @param seed 初始元素
* @param f UnaryOperator,函数式接口,接收T类型参数,调用apply后返回T本身,应用于上一个元素以产生新元素
*/
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {}
??eg:创建一个从0开始,每次加2的无限流,并限制收集前十个元素
List<Integer> list = Stream.iterate(0, c -> c + 2)
.limit(10)
.collect(Collectors.toList());
//output:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
??eg:斐波那契数列,从[0, 1]开始,下一个元素是前两个元素之和,并限制收集前十个数组中的首元素
List<Integer> list = Stream.iterate(new Integer[]{0, 1}, c -> new Integer[]{c[1], c[0] + c[1]})
.map(c -> c[0])
.limit(10)
.collect(Collectors.toList());
//output:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
/**
* @param s Supplier,函数式接口,生产者,返回T
*/
public static<T> Stream<T> generate(Supplier<T> s) {}
??eg:生成十个随机数
List<Double> list = Stream.generate(Math::random)
.limit(10)
.collect(Collectors.toList());
原文:https://www.cnblogs.com/milete/p/14050460.html