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

Java stream 和 for 循环

  •  
  •   xalilo · 2019-09-03 20:27:47 +08:00 · 6335 次点击
    这是一个创建于 1913 天前的主题,其中的信息可能已经有所发展或是发生改变。

    针对同一个集合,用 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 循环只是一次,大家都是怎么选择的?

    freebird1994
        1
    freebird1994  
       2019-09-03 20:36:05 +08:00 via Android
    这没啥纠结的吧。for 循环呀
    015
        2
    015  
       2019-09-03 20:36:47 +08:00 via iPhone
    我选 stream
    maninfog
        3
    maninfog  
       2019-09-03 20:42:10 +08:00 via iPhone
    复杂度来看 for 要低些?
    viakiba
        4
    viakiba  
       2019-09-03 20:42:40 +08:00 via Android
    stream 也可以 foreach 啊
    Inside
        5
    Inside  
       2019-09-03 20:54:56 +08:00   ❤️ 2
    partitionBy、groupBy 了解一下。

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

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