这个Stream对象是否创建了一个无限的黑猩猩对象列表或只有一个黑猩猩对象?

时间:2017-05-10 09:48:07

标签: java java-stream

在OCP学习手册中,有一系列我完全不了解的代码。它是这样的:

  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

这是否仅使用一个名为chimp的元素创建无限流,或者它是否无限生成黑猩猩字符串。谢谢。

2 个答案:

答案 0 :(得分:1)

  

Stream java.util.stream.Stream.generate(供应商)

     

返回无限顺序无序流,其中每个元素由提供的供应商生成。这适用于生成恒定流,随机元素流等。

它将创建一个无限Stream,这意味着Stream具有无限数量的元素。所有元素都是相同的String实例,因为"chimp"将始终从String池返回相同的String实例。

如果您将其更改为

Stream<String> infinite = Stream.generate(() -> new String("chimp"));

String的每个Stream元素都是唯一的实例。

答案 1 :(得分:1)

除非流管道中有终端操作,否则不会发生任何事情,请参阅Stream operations and pipelines部分。例如这段代码:

infinite.forEach(System.out::println); // chimp ....

将打印不定数量的chimp字符串。 但是这行只会打印一个String

infinite.limit(1).forEach(System.out::println); // chimp 

另一方面

Stream.generate(() -> "chimp");

没有效果,流的管道中没有终端操作。

  

中间操作返回一个新流。他们总是懒惰;   执行诸如filter()之类的中间操作实际上并不是这样   执行任何过滤,而是创建一个新的流,当时   遍历,包含匹配的初始流的元素   给出谓词。直到管道源的遍历才开始   执行管道的终端操作。