当前位置 博文首页 > 最孤单的人的博客:Java 8 流的进阶(Stream)- 自己生成流

    最孤单的人的博客:Java 8 流的进阶(Stream)- 自己生成流

    作者:[db:作者] 时间:2021-08-04 15:05

    接着上一篇:Java 8 流的使用详解(Stream)

    Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。?

    Stream的使用,会使代码更加简洁易读;而且Java 8 的 Stream 使用并发模式,程序执行速度更快。

    ?

    #1. Stream.generate

    通过实现 Supplier 接口,你可以自己来控制流的生成。这种情形通常用于随机数、常量的 Stream,或者需要前后元素间维持着某种状态信息的 Stream。把 Supplier 实例传递给 Stream.generate() 生成的 Stream,

    默认是串行(相对 parallel 而言)但无序的(相对 ordered 而言)。由于它是无限的,在管道中,必须利用 limit 之类的操作限制 Stream 大小。

    # 生成 10 个随机整数:

    Random seed = new Random();
    Supplier<Integer> random = seed::nextInt;
    Stream.generate(random).limit(10).forEach(System.out::println);
    //Another way
    IntStream.generate(() -> (int) (System.nanoTime() % 100)).limit(10).forEach(System.out::println);

    Stream.generate() 还接受自己实现的 Supplier。例如在构造海量测试数据的时候,用某种自动的规则给每一个变量赋值;或者依据公式计算 Stream 的每个元素值。这些都是维持状态信息的情形。

    #?自实现 Supplier:

    Stream.generate(new PersonSupplier())
           .limit(10)
           .forEach(p -> System.out.println(p.getName() + ", " + p.getAge()));
    
    private class PersonSupplier implements Supplier<Person> {
         private int index = 0;
         private Random random = new Random();
         @Override
         public Person get() {
              return new Person(index++, "StormTestUser" + index, random.nextInt(100));
         }
    }

    输出结果:

     StormTestUser1, 9
    StormTestUser2, 12
    StormTestUser3, 88
    StormTestUser4, 51
    StormTestUser5, 22
    StormTestUser6, 28
    StormTestUser7, 81
    StormTestUser8, 51
    StormTestUser9, 4
    StormTestUser10, 76

    ?

    #2. Stream.iterate

    iterate 跟 reduce 操作很像,接受一个种子值,和一个 UnaryOperator(例如 f)。然后种子值成为 Stream 的第一个元素,f(seed) 为第二个,f(f(seed)) 第三个,以此类推。

    # 生成一个等差数列

    Stream.iterate(0, n -> n + 3).limit(10). forEach(x -> System.out.print(x + " "));

    输出结果:

    0 3 6 9 12 15 18 21 24 27

    ?? 与 Stream.generate 相仿,在 iterate 时候管道必须有 limit 这样的操作来限制 Stream 大小。

    ?

    >>>>>>>>?Java 8 流的进阶(Stream)- 用 Collectors 来进行 reduction 操作

    ?

    cs