Java8-无限流

使用无限流的前提条件

  流是惰性的,分为中间操作和终止操作,在执行终止操作之前,流的遍历不会开始,基于这一特性,才可以使用无限流;
  使用无限流,需要正确的做限制(limit),截断流。

无限流的两种生成方式

  1. iterate():接收一个初始元素seed,生成从seed到f的迭代流
/**
 * @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]
  1. generate():接收一个Supplier函数式接口作为参数,生成迭代流
/**
 * @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());

无限流-补全日期,折线图补零demo

posted @ 2020-11-27 21:40  米雷特  阅读(401)  评论(0编辑  收藏  举报