
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 Dec 17, 2022 stream 的目的就三个 一是减少迭代次数,除了有状态操作(比如 sort ,distinct )其他尽可能都是 one pass 完成,且会提前终止 二是非常便利的并行 三是 immutable ,不修改原集合 |
2 t202201 Dec 18, 2022 via iPhone 同问,还有连写两个 map 的情况,会有区别吗,以及 stream 对比 for 循环的效率怎么样?一直很疑惑,但很懒,自己没试过 |
3 JinTianYi456 OP @t202201 #2 雀氏,想了解全面还是得看源码实现,但是我也懒~ |
4 lmshl Dec 18, 2022 这东西看源码没用,最后还是要以 JIT 为准,JIT 会把能 inline 的都 inline 掉,减少函数调用开销 |
5 hiranye Dec 19, 2022 map filter 这种无状态 api 是不会中断遍历的,sort 这种属于有状态操作,需要等到上游全部完成才能执行,因此会中断遍历。所以 case1 case2 都是一次遍历; case3 是三次(包括排序),如果把 map 放到 sort 前面,那就是两次。 |