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