我很难为这篇文章起个名字。
基本上,我有两个设置:分别称为A
和B
。
我要执行以下操作(\
代表除外):
C = A\B
loop through C;
D = B\A
loop through D;
loop through B;
我的第一个成功尝试是:
// B and A are lists
List<T> C = new LinkedList<>(A);
C.removeAll(B);
for (T other : C)
operationX(other);
List<T> D = new LinkedList<>(B);
D.removeAll(A);
for (T other : D)
operationY(other);
for (T other : B)
operationZ(other);
但这似乎太慢了。假设该函数每秒被调用数百次,并且集合可以包含数百个对象。
实现这一目标的有效方法是什么样的?
最佳答案
如果您只是计划遍历C
,则根本不需要创建它。您可以简单地过滤出A
中包含的B
中的每个元素,然后对每个过滤后的元素调用operationX
:
Set<T> bSet = new HashSet<>(B);
A.stream()
.filter(a -> !bSet.contains(a))
.forEach(this::operationX);
假设
B
中可能存在重复元素,并且所有重复项都需要调用operationY
,那么我们可以使用以下内容:Set<T> aSet = new HashSet<>(A);
B.stream()
.filter(b -> !aSet.contains(b))
.forEach(this::operationY);
B.forEach(this::operationZ);
如果即使存在重复,也仅需要为
operationY
中的每个元素调用一次B
,那么我建议改用以下代码:bSet.removeAll(A);
bSet.forEach(this::operationY);
B.forEach(this::operationZ);