Java stream 和 for 循环

2019-09-03 20:27:47 +08:00
 xalilo

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

6141 次点击
所在节点    Java
19 条回复
freebird1994
2019-09-03 20:36:05 +08:00
这没啥纠结的吧。for 循环呀
015
2019-09-03 20:36:47 +08:00
我选 stream
maninfog
2019-09-03 20:42:10 +08:00
复杂度来看 for 要低些?
viakiba
2019-09-03 20:42:40 +08:00
stream 也可以 foreach 啊
Inside
2019-09-03 20:54:56 +08:00
partitionBy、groupBy 了解一下。

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

如果你真的懂了这种集合操作风格,换什么语言都是一样的,极少再去用 for 循环了,思维已经完全换掉了。
chendy
2019-09-03 20:56:47 +08:00
个人倾向 for
nosilence
2019-09-03 20:58:58 +08:00
没有百万级别数据,就用 for
千条数据,for 的耗时可能为 0,stream 直接 50ms+起步
jiyingze
2019-09-03 21:01:17 +08:00
stream,foreach,第一次调用 JVM 有个预热的过程。
预热后和 for 效率都差不多
SuperMild
2019-09-03 21:03:36 +08:00
不要考虑效率,等以后有需要再优化。
billlee
2019-09-03 21:06:47 +08:00
@Inside #5 Scala 直接不提供 for 循环
wineway
2019-09-03 21:11:09 +08:00
想保存中间状态用 reduce ……
monsoon
2019-09-03 22:05:43 +08:00
虽然我没仔细考虑过。不过你这个可以用 Java 12 的 teeing collector 加两个 Java 9 里的 filtering collector s 做的。
如果不知道怎么做,用类似 fold 之类的方法也都是可以的。
seeker
2019-09-03 22:14:34 +08:00
算法复杂度来说是一样的
另外,循环 2 遍,每遍做 1 件事 VS 循环 1 遍,每次做 2 件事又有多少差别呢?楼主测了没
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
2019-09-04 00:26:57 +08:00
看你后需要怎么做。如果两个 list 分别用在不同的任务上,那还是趁早把这两个逻辑分开。否则的话,应该有更合理的只需一次 filter 的逻辑。
1424659514
2019-09-04 08:39:46 +08:00
groupBy 了解一下
specita
2019-09-04 09:44:47 +08:00
同上面,可以用 partitionBy
zclHIT
2019-09-04 13:34:23 +08:00
stream,先做 partition,再进行 group
xalilo
2019-09-04 16:21:22 +08:00
@zclHIT 属性可能有很多值,只需要值为 a,b;groupBy 理解,partitionBy+groupBy 是怎么实现?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/597652

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX