Нет необходимости вообще создавать 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);