Java .util.stream api 在这些情况会有遍历优化吗?

2022-12-17 22:56:27 +08:00
 JinTianYi456

demo case 1

list.stream().filter(null).map(null).collect(Collectors.toList());

// 感觉它可以在每次 map 前做 filter 操作,看起来只要遍历一遍 list 就行。所以源码实现是有优化吗?

demo case 2

list.stream().map(null).filter(null).collect(Collectors.toList());

// 感觉它可以在每次 map 后做 filter 操作,看起来只要遍历一遍 list 就行。所以源码实现是有优化吗?

demo case 3

// 普通写法
list=filter(list); // 遍历 1 次
list=sort(list); // 姑且把它叫做遍历 1 次
map(list); // 遍历 1 次


// stream api
list.stream().filter(null).sorted(null).map(null).collect(Collectors.toList());

// 不知道源码对这种情况是否有遍历优化?
1475 次点击
所在节点    Java
5 条回复
TWorldIsNButThis
2022-12-17 23:11:51 +08:00
stream 的目的就三个
一是减少迭代次数,除了有状态操作(比如 sort ,distinct )其他尽可能都是 one pass 完成,且会提前终止
二是非常便利的并行
三是 immutable ,不修改原集合
t202201
2022-12-18 09:34:39 +08:00
同问,还有连写两个 map 的情况,会有区别吗,以及 stream 对比 for 循环的效率怎么样?一直很疑惑,但很懒,自己没试过
JinTianYi456
2022-12-18 10:16:01 +08:00
@t202201 #2 雀氏,想了解全面还是得看源码实现,但是我也懒~
lmshl
2022-12-18 11:50:23 +08:00
这东西看源码没用,最后还是要以 JIT 为准,JIT 会把能 inline 的都 inline 掉,减少函数调用开销
dranfree
2022-12-19 00:48:09 +08:00
map filter 这种无状态 api 是不会中断遍历的,sort 这种属于有状态操作,需要等到上游全部完成才能执行,因此会中断遍历。所以 case1 case2 都是一次遍历; case3 是三次(包括排序),如果把 map 放到 sort 前面,那就是两次。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/903207

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX