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