Использование таких вложенных циклов - O (N * M) и дорого, но это также многословно, что скрывает цель того, чего вы пытаетесь достичь.Я предлагаю вам использовать потоки из Java 8.
// get all the event's ids
Set<String> eventIds = events.stream()
.map(Event::getId)
.collect(Collectors.toSet());
// remove the entries from items with a matching id.
items.removeIf(i -> eventIds.contains(i.getEventId()));
Это имеет временную сложность O (N + M).
И удаленные / заявленные элементы добавляются к другомусписок (я называю это EventDto, объект передачи данных)
Вы можете сделать это, сначала создав список.
// remove the entries from items with a matching id.
List<EventItem> toMove = items.stream()
.filter(i -> eventIds.contains(i.getEventId()))
.collect(Collectors.toList());
items.removeAll(toMove);
anotherList.addAll(toMove);
Это может быть более эффективным, если идентификаториспользовался в качестве ключа карты
например
Map<String, Event> events = ... // events keyed by id
Map<String, EventItem> items = ... // event items keys by eventId
events.keySet().removeAll(items.keySet());