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