Java 这个流对象是创建一个无限的黑猩猩对象列表,还是只创建一个黑猩猩对象?
在OCP研究书中,有一行代码我并不完全理解。事情是这样的:Java 这个流对象是创建一个无限的黑猩猩对象列表,还是只创建一个黑猩猩对象?,java,java-stream,Java,Java Stream,在OCP研究书中,有一行代码我并不完全理解。事情是这样的: Stream<String> infinite = Stream.generate(() -> "chimp"); Stream infinite=Stream.generate(()->“chimp”); 这是创建一个只有一个名为chimp的元素的无限流,还是无限生成chimp字符串。多谢各位 流java.util.Stream.Stream.generate(供应商) 返回无限顺序无序流,其中每个元素由提供的供
Stream<String> infinite = Stream.generate(() -> "chimp");
Stream infinite=Stream.generate(()->“chimp”);
这是创建一个只有一个名为chimp的元素的无限流,还是无限生成chimp字符串。多谢各位
流java.util.Stream.Stream.generate(供应商)
返回无限顺序无序流,其中每个元素由提供的供应商生成。这适用于生成恒定流、随机元素流等
它将创建一个无限的流
,这意味着一个元素数量无限的流。所有元素都将是相同的String
实例,因为“chimp”
将始终从String
池返回相同的String
实例
如果你把它改成
Stream<String> infinite = Stream.generate(() -> new String("chimp"));
Stream infinite=Stream.generate(()->新字符串(“chimp”);
此流
的每个字符串
元素都将是唯一的实例
流java.util.Stream.Stream.generate(供应商)
返回无限顺序无序流,其中每个元素由提供的供应商生成。这适用于生成恒定流、随机元素流等
它将创建一个无限的流
,这意味着一个元素数量无限的流。所有元素都将是相同的String
实例,因为“chimp”
将始终从String
池返回相同的String
实例
如果你把它改成
Stream<String> infinite = Stream.generate(() -> new String("chimp"));
Stream infinite=Stream.generate(()->新字符串(“chimp”);
此流的每个字符串
元素都将是唯一的实例。除非流管道中有终端操作,否则不会发生任何事情。请参见第节。例如,此代码:
infinite.forEach(System.out::println); // chimp ....
将打印不定数的chimp
字符串。
但是,此行将只打印一个字符串
infinite.limit(1).forEach(System.out::println); // chimp
在另一边
Stream.generate(() -> "chimp");
没有效果,流的管道中没有终端操作
中间操作返回一个新的流。他们总是懒惰;
执行诸如filter()之类的中间操作实际上不会
执行任何筛选,但创建一个新流,当
遍历,包含与
给定谓词。管道源的遍历直到
执行管道的终端操作
除非在流管道中有终端操作,否则不会发生任何事情。请参见第节。例如,此代码:
infinite.forEach(System.out::println); // chimp ....
将打印不定数的chimp
字符串。
但是,此行将只打印一个字符串
infinite.limit(1).forEach(System.out::println); // chimp
在另一边
Stream.generate(() -> "chimp");
没有效果,流的管道中没有终端操作
中间操作返回一个新的流。他们总是懒惰;
执行诸如filter()之类的中间操作实际上不会
执行任何筛选,但创建一个新流,当
遍历,包含与
给定谓词。管道源的遍历直到
执行管道的终端操作
试试看你可以查阅文档,也可以自己试试。。。。你真的不费吹灰之力,试试看你可以查阅文档,也可以自己试试。。。。你真的不费吹灰之力,好吧,如果我理解正确的话,只有当像forEach(System.out::println)这样的终端操作方法在流实例上运行时,流才会开始生成那些chimp字符串?@Maurice,是的。您可以根据需要应用任意多个中间操作,但除非有一个终端操作,否则它们没有任何效果。从java文档:中间操作返回一个新流。他们总是懒惰;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,当遍历该流时,该流包含与给定谓词匹配的初始流元素。在执行管道的终端操作之前,管道源的遍历不会开始。因此,如果我理解正确,只有当终端操作方法(如forEach(System.out::println))在流实例上运行时,流才会开始生成这些chimp字符串?@Maurice,是的。您可以根据需要应用任意多个中间操作,但除非有一个终端操作,否则它们没有任何效果。从java文档:中间操作返回一个新流。他们总是懒惰;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,当遍历该流时,该流包含与给定谓词匹配的初始流元素。在执行管道的终端操作之前,不会开始遍历管道源。