Не повторять и removeIf
использовать элементы вашей итерации. Помимо проблемы, с которой вы сейчас сталкиваетесь, эти вызовы сводятся к повторению всей коллекции для каждого элемента коллекции (поэтому вы все еще удаляете из коллекции во время итерации, что объясняет исключение!).
removeIf
выполняет итерации для вас, поэтому все, что вам нужно, это предикат SomeObject
:
//no loop
someObjectSet.removeIf(ele -> if ele satisfies some condition);
, где ele -> if ele satisfies some condition
- это условие, что каждый SomeObject
элемент будет проверен на соответствие (те, кто пройдет тест, будут удалены). forEach
организует тест для всех элементов в someObjectSet
, вам не нужно это делать.
Если у вас возникло вторичное условие, на основе которого вы хотите удалить элементы, затем вы можете составить предикаты (с or
), как в этом примере:
Set<Integer> set = new HashSet<>(Set.of(1, 2, 3, 4, 5, 6, 7, 8, 9));
Predicate<Integer> predicate = s -> s % 2 == 0;
Predicate<Integer> predicate2 = predicate.or(s -> s % 3 == 0);
set.removeIf(predicate2);
// Test with set.removeIf(predicate);
// then with set.removeIf(predicate2);
// and compare results