V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JinTianYi456
V2EX  ›  Java

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

  •  
  •   JinTianYi456 · 2022-12-17 22:56:27 +08:00 · 1632 次点击
    这是一个创建于 700 天前的主题,其中的信息可能已经有所发展或是发生改变。

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