针对同一个集合,用 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);
}
}
1
freebird1994 Sep 3, 2019 via Android
这没啥纠结的吧。for 循环呀
|
2
015 Sep 3, 2019 via iPhone
我选 stream
|
3
maninfog Sep 3, 2019 via iPhone
复杂度来看 for 要低些?
|
4
viakiba Sep 3, 2019 via Android
stream 也可以 foreach 啊
|
5
Inside Sep 3, 2019 partitionBy、groupBy 了解一下。
函数式的集合操作可以说就跟你写 SQL 差不多,各大语言都有差不多的实现,相当于在语言中集成一定程度的 SQL 来操作集合。 如果你真的懂了这种集合操作风格,换什么语言都是一样的,极少再去用 for 循环了,思维已经完全换掉了。 |
6
chendy Sep 3, 2019
个人倾向 for
|
7
nosilence Sep 3, 2019
没有百万级别数据,就用 for
千条数据,for 的耗时可能为 0,stream 直接 50ms+起步 |
8
jiyingze Sep 3, 2019 via iPhone
stream,foreach,第一次调用 JVM 有个预热的过程。
预热后和 for 效率都差不多 |
9
SuperMild Sep 3, 2019
不要考虑效率,等以后有需要再优化。
|
11
wineway Sep 3, 2019 via iPhone 想保存中间状态用 reduce ……
|
12
monsoon Sep 3, 2019 via Android
虽然我没仔细考虑过。不过你这个可以用 Java 12 的 teeing collector 加两个 Java 9 里的 filtering collector s 做的。
如果不知道怎么做,用类似 fold 之类的方法也都是可以的。 |
13
seeker Sep 3, 2019
算法复杂度来说是一样的
另外,循环 2 遍,每遍做 1 件事 VS 循环 1 遍,每次做 2 件事又有多少差别呢?楼主测了没 |
14
Rwing Sep 3, 2019
不会再选择 for 了,写的爽的最重要,而且语义也很明晰,尤其 C#的语法;
var list1 = list.Select(x => x.Prop1 == "a"); var list2 = list.Select(x => x.Prop1 == "b"); |
15
yidinghe Sep 4, 2019 via Android
看你后需要怎么做。如果两个 list 分别用在不同的任务上,那还是趁早把这两个逻辑分开。否则的话,应该有更合理的只需一次 filter 的逻辑。
|
16
1424659514 Sep 4, 2019
groupBy 了解一下
|
17
specita Sep 4, 2019
同上面,可以用 partitionBy
|
18
zclHIT Sep 4, 2019
stream,先做 partition,再进行 group
|