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

Java stream 和 for 循环

  •  
  •   xalilo 2019 年 9 月 3 日 6938 次点击
    这是一个创建于 2332 天前的主题,其中的信息可能已经有所发展或是发生改变。

    针对同一个集合,用 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 年 9 月 3 日 via Android
    这没啥纠结的吧。for 循环呀
    015
        2
    015  
       2019 年 9 月 3 日 via iPhone
    我选 stream
    maninfog
        3
    maninfog  
       2019 年 9 月 3 日 via iPhone
    复杂度来看 for 要低些?
    viakiba
        4
    viakiba  
       2019 年 9 月 3 日 via Android
    stream 也可以 foreach 啊
    Inside
        5
    Inside  
       2019 年 9 月 3 日   2
    partitionBy、groupBy 了解一下。

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

    如果你真的懂了这种集合操作风格,换什么语言都是一样的,极少再去用 for 循环了,思维已经完全换掉了。
    chendy
        6
    chendy  
       2019 年 9 月 3 日
    个人倾向 for
    nosilence
        7
    nosilence  
       2019 年 9 月 3 日
    没有百万级别数据,就用 for
    千条数据,for 的耗时可能为 0,stream 直接 50ms+起步
    jiyingze
        8
    jiyingze  
       2019 年 9 月 3 日 via iPhone
    stream,foreach,第一次调用 JVM 有个预热的过程。
    预热后和 for 效率都差不多
    SuperMild
        9
    SuperMild  
       2019 年 9 月 3 日
    不要考虑效率,等以后有需要再优化。
    billlee
        10
    billlee  
       2019 年 9 月 3 日
    @Inside #5 Scala 直接不提供 for 循环
    wineway
        11
    wineway  
       2019 年 9 月 3 日 via iPhone   1
    想保存中间状态用 reduce ……
    monsoon
        12
    monsoon  
       2019 年 9 月 3 日 via Android
    虽然我没仔细考虑过。不过你这个可以用 Java 12 的 teeing collector 加两个 Java 9 里的 filtering collector s 做的。
    如果不知道怎么做,用类似 fold 之类的方法也都是可以的。
    seeker
        13
    seeker  
       2019 年 9 月 3 日
    算法复杂度来说是一样的
    另外,循环 2 遍,每遍做 1 件事 VS 循环 1 遍,每次做 2 件事又有多少差别呢?楼主测了没
    Rwing
        14
    Rwing  
       2019 年 9 月 3 日
    不会再选择 for 了,写的爽的最重要,而且语义也很明晰,尤其 C#的语法;
    var list1 = list.Select(x => x.Prop1 == "a");
    var list2 = list.Select(x => x.Prop1 == "b");
        15
    yidinghe  
       2019 年 9 月 4 日 via Android
    看你后需要怎么做。如果两个 list 分别用在不同的任务上,那还是趁早把这两个逻辑分开。否则的话,应该有更合理的只需一次 filter 的逻辑。
    1424659514
        16
    1424659514  
       2019 年 9 月 4 日
    groupBy 了解一下
    specita
        17
    specita  
       2019 年 9 月 4 日
    同上面,可以用 partitionBy
    zclHIT
        18
    zclHIT  
       2019 年 9 月 4 日
    stream,先做 partition,再进行 group
    xalilo
        19
    xalilo  
    OP
       2019 年 9 月 4 日
    @zclHIT 属性可能有很多值,只需要值为 a,b;groupBy 理解,partitionBy+groupBy 是怎么实现?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5243 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 01:23 PVG 09:23 LAX 17:23 JFK 20:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86