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

abo*_*cic 4 java java-8

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

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);
Run Code Online (Sandbox Code Playgroud)

输出:

Student{id=null, username=null, password=null}
Student{id=0, username=7d7403e0-89f0-4033-a874-31e0aae1d7c6, password=590baa12-a9f7-4fef-8a47-4bcb7f2174d1}
Student{id=3, username=d75bff67-a1f7-4969-9418-93f3e0eb1cd7, password=9e48d614-a15e-4f2a-9e87-63ed3a81f410}
Student{id=3, username=47943516-e8bd-4ffe-bc47-4e251104994a, password=f2d4d02d-2e37-4346-a51d-b83f40044c68}
Student{id=2, username=1a1e5f9e-7fac-439f-b5f2-2931884e0772, password=9df36248-5e1e-4b28-b1c0-020123dd26b8}
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

Jea*_*art 7

作为给定答案的补充:使用iterate您的方式,您实际上只创建了一个Student持续变异的实例.

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

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

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


F. *_*n Q 5

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