JinTianYi456
V2EX  ›  Java

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

  •  
  •   JinTianYi456 · Dec 17, 2022 · 2236 views
    This topic created in 1267 days ago, the information mentioned may be changed or developed.

    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());
    
    // 不知道源码对这种情况是否有遍历优化?
    
    5 replies    2022-12-19 00:48:09 +08:00
    TWorldIsNButThis
        1
    TWorldIsNButThis  
       Dec 17, 2022
    stream 的目的就三个
    一是减少迭代次数,除了有状态操作(比如 sort ,distinct )其他尽可能都是 one pass 完成,且会提前终止
    二是非常便利的并行
    三是 immutable ,不修改原集合
    t202201
        2
    t202201  
       Dec 18, 2022 via iPhone
    同问,还有连写两个 map 的情况,会有区别吗,以及 stream 对比 for 循环的效率怎么样?一直很疑惑,但很懒,自己没试过
    JinTianYi456
        3
    JinTianYi456  
    OP
       Dec 18, 2022
    @t202201 #2 雀氏,想了解全面还是得看源码实现,但是我也懒~
    lmshl
        4
    lmshl  
       Dec 18, 2022
    这东西看源码没用,最后还是要以 JIT 为准,JIT 会把能 inline 的都 inline 掉,减少函数调用开销
    hiranye
        5
    hiranye  
       Dec 19, 2022
    map filter 这种无状态 api 是不会中断遍历的,sort 这种属于有状态操作,需要等到上游全部完成才能执行,因此会中断遍历。所以 case1 case2 都是一次遍历; case3 是三次(包括排序),如果把 map 放到 sort 前面,那就是两次。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   854 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 20:52 · PVG 04:52 · LAX 13:52 · JFK 16:52
    ♥ Do have faith in what you're doing.