管道中的限制(长)差异顺序

oct*_*pus 4 java java-8 java-stream

有什么区别

stream.map().limit(5).terminalOperation()
Run Code Online (Sandbox Code Playgroud)

这条线

stream.limit(5).map().terminalOperation()
Run Code Online (Sandbox Code Playgroud)

这两行将返回相同的结果,但哪一行更优化,不会消耗更多的时间和资源?为什么?以及在每种情况下调用地图的次数?

Era*_*ran 6

在每种情况下调用地图的次数是多少?

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

终端操作可能只消耗一个元素(findFirst())或所有元素(collect()).

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

例如,如果将元素收集到a List,假设Stream源至少有5个元素,map则每个管道将执行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());
Run Code Online (Sandbox Code Playgroud)

这将输出:

map1 a
map1 b
map1 c
map1 d
map1 e
map2 a
map2 b
map2 c
map2 d
map2 e
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,map都不会为第6个元素执行.

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