Java 管道中的限制(长)差序

Java 管道中的限制(长)差序,java,java-8,java-stream,Java,Java 8,Java Stream,两者的区别是什么 stream.map().limit(5).terminalOperation() 这条线呢 stream.limit(5).map().terminalOperation() 这两行将返回相同的结果,但哪一行更优化并且不会消耗更多的时间和资源?为什么?在每种情况下,map将被调用多少次 在每种情况下,map将被调用多少次 答案取决于终端操作,而不是map和limit的顺序 终端操作可能只使用一个元素(findFirst())或所有元素(collect()) 无论哪种方式,

两者的区别是什么

stream.map().limit(5).terminalOperation()
这条线呢

stream.limit(5).map().terminalOperation()
这两行将返回相同的结果,但哪一行更优化并且不会消耗更多的时间和资源?为什么?在每种情况下,map将被调用多少次

在每种情况下,map将被调用多少次

答案取决于终端操作,而不是
map
limit
的顺序

终端操作可能只使用一个元素(
findFirst()
)或所有元素(
collect()

无论哪种方式,终端操作都会指定执行
map
的元素数量,这两种情况下都应该相同

例如,如果将元素收集到
列表
,假设
源至少有5个元素,则每个管道将执行5次
映射

您可以通过将
println
语句添加到
map
步骤来验证:

List<String> list = Arrays.asList ("a","b","c","d","e","f");
list.stream().map(l->{System.out.println ("map1 " + l);return l +"44";}).limit(5).collect(Collectors.toList());
list.stream().limit(5).map(l->{System.out.println ("map2 " + l);return l +"44";}).collect(Collectors.toList());
无论哪种方式,
map
都不会对第6个元素执行

至于选择哪种变体,我假设它们的运行时间相似,但这取决于实际实现

map1 a
map1 b
map1 c
map1 d
map1 e
map2 a
map2 b
map2 c
map2 d
map2 e