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

Java stream 和 for 循环

  •  
  •   xalilo · 69 天前 · 2025 次点击
    这是一个创建于 69 天前的主题,其中的信息可能已经有所发展或是发生改变。

    针对同一个集合,用 stream 两次得到两个不同条件筛选的集合

     List<Object> list1 = list.stream()		
        .filter(x->"a".equals(x.getProp1()))		
        .collect(toList());
    List<Object> list2 = list.stream()
        .filter(x->"b".equals(x.getProp2()))
        .collect(toList());   
    

    用 for 循环

    List<Object> list1 = new ArrayList();
    List<Object> list2 = new ArrayList();
    for(Object obj : list){
        if("a".equals(obj.getProp1())){
            list1.add(obj);
        }
        if("b".equals(obj.getProp2())){
            list2.add(obj);
        }
    }
    

    stream 要遍历两次,for 循环只是一次,大家都是怎么选择的?

        1
    freebird1994   69 天前 via Android
    这没啥纠结的吧。for 循环呀
        2
    015   69 天前 via iPhone
    我选 stream
        3
    maninfog   69 天前 via iPhone
    复杂度来看 for 要低些?
        4
    viakiba   69 天前 via Android
    stream 也可以 foreach 啊
        5
    Inside   69 天前   ♥ 2
    partitionBy、groupBy 了解一下。

    函数式的集合操作可以说就跟你写 SQL 差不多,各大语言都有差不多的实现,相当于在语言中集成一定程度的 SQL 来操作集合。

    如果你真的懂了这种集合操作风格,换什么语言都是一样的,极少再去用 for 循环了,思维已经完全换掉了。
        6
    chendy   69 天前
    个人倾向 for
        7
    nosilence   69 天前
    没有百万级别数据,就用 for
    千条数据,for 的耗时可能为 0,stream 直接 50ms+起步
        8
    jiyingze   69 天前 via iPhone
    stream,foreach,第一次调用 JVM 有个预热的过程。
    预热后和 for 效率都差不多
        9
    SuperMild   69 天前
    不要考虑效率,等以后有需要再优化。
        10
    billlee   69 天前
    @Inside #5 Scala 直接不提供 for 循环
        11
    wineway   69 天前 via iPhone   ♥ 1
    想保存中间状态用 reduce ……
        12
    monsoon   69 天前 via Android
    虽然我没仔细考虑过。不过你这个可以用 Java 12 的 teeing collector 加两个 Java 9 里的 filtering collector s 做的。
    如果不知道怎么做,用类似 fold 之类的方法也都是可以的。
        13
    seeker   69 天前
    算法复杂度来说是一样的
    另外,循环 2 遍,每遍做 1 件事 VS 循环 1 遍,每次做 2 件事又有多少差别呢?楼主测了没
        14
    Rwing   69 天前
    不会再选择 for 了,写的爽的最重要,而且语义也很明晰,尤其 C#的语法;
    var list1 = list.Select(x => x.Prop1 == "a");
    var list2 = list.Select(x => x.Prop1 == "b");
        15
    yidinghe   69 天前 via Android
    看你后需要怎么做。如果两个 list 分别用在不同的任务上,那还是趁早把这两个逻辑分开。否则的话,应该有更合理的只需一次 filter 的逻辑。
        16
    1424659514   69 天前
    groupBy 了解一下
        17
    specita   69 天前
    同上面,可以用 partitionBy
        18
    zclHIT   68 天前
    stream,先做 partition,再进行 group
        19
    xalilo   68 天前
    @zclHIT 属性可能有很多值,只需要值为 a,b;groupBy 理解,partitionBy+groupBy 是怎么实现?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3530 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 05:25 · PVG 13:25 · LAX 21:25 · JFK 00:25
    ♥ Do have faith in what you're doing.