xalilo
V2EX  ›  Java

Java stream 和 for 循环

  •  
  •   xalilo · Sep 3, 2019 · 7658 views
    This topic created in 2617 days ago, the information mentioned may be changed or developed.

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

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

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