为什么Stream.iterate返回null作为第一个元素

时间:2015-09-03 18:37:55

标签: java java-8

我正在尝试初始化随机5个元素(对象),我正在尝试使用 Stream.iterate 函数,但是错误的第一个元素(对象)总是 null

nil

输出:

Stream.iterate(new Student(), s -> {
        s.setId(new Random().nextInt(5));
        s.setUsername(UUID.randomUUID().toString());
        s.setPassword(UUID.randomUUID().toString());
        return s;
}).limit(5)
    .forEach(System.out::println);

这里有什么问题?

3 个答案:

答案 0 :(得分:7)

作为给定答案的补充:按照您的方式使用iterate,您实际上只创建了一个Student的实例,并且您一直在变异。

只要使用forEach方法使用流的每个元素,就可以了。如果您在List中收集了流,那么在应用最后一个变异后,您将获得相同元素的5倍列表。

如果要创建多个实例,请使用generate

Stream.generate(() -> new Student(new Random().nextInt(5), 
                                  UUID.randomUUID().toString(),
                                  UUID.randomUUID().toString()))
      .limit(5)
      .forEach(System.out::println);

答案 1 :(得分:5)

Stream.iterate()返回的第一个元素是种子元素,即您提供的新Student()。请参阅javadoc

答案 2 :(得分:0)

我找到了基于之前答案的问题解决方案

Stream.generate(Student::new)
        .map(s -> {
            s.setId(new Random().nextInt(5));
            s.setUsername(UUID.randomUUID().toString());
            s.setPassword(UUID.randomUUID().toString());
            return s;
        }).limit(5)
        .forEach(System.out::println);

全部谢谢。