我很难为这篇文章起个名字。
基本上,我有两个设置:分别称为AB

我要执行以下操作(\代表除外):

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);

10-08 00:07