#java #java-8
#java #java-8
Вопрос:
Я использую removeIf
для удаления определенных объектов из списка, если их имя или код имеют значение null:
tables.removeIf(t -> ((t.getName() == null) || (t.getCode() == null)));
Есть ли способ получить фактические элементы t
, которые были удалены здесь? Может быть, список удаленных элементов или, что еще лучше, поток удаленных элементов?
Спасибо
Ответ №1:
Вы можете разделить по своему критерию, а затем использовать результат для чего угодно:
Map<Boolean, List<MyClass>> split = tables.stream()
.collect(Collectors.partitioningBy(t ->
t.getName() == null || t.getCode() == null));
List<MyClass> cleanList = split.get(Boolean.FALSE);
List<MyClass> removedList = split.get(Boolean.TRUE);
cleanList
содержит то, что tables
содержалось бы после removeIf
, и removedList
данные, которые были удалены (те, которые вы искали)
Комментарии:
1. Побейте меня на 2 минуты 😉
2. 🙂 Возможно, это первый раз, когда я достигаю успеха!
3. Мне нравится это решение, лучше, чем мое 😉
4. спасибо @YCF_L — но я думаю, что ваш пост не нужно было удалять.
Ответ №2:
Как насчет сделать это в два этапа :
найдите объекты, которые вы хотите удалить:
List<ObjectName> toBeRemoved = tables.stream()
.filter(t -> t.getName() == null || t.getCode() == null)
.collect(Collectors.toList());
а затем удалите их из списка :
tables.removeAll(toBeRemoved);
Комментарии:
1. Или, конечно, вы могли бы сделать это с помощью цикла итератора, добавляя элементы в список по мере их удаления.
2. @AndyTurner точно
3. Может быть важно отметить, что это предполагает, что
ObjectName
имеетequals
иhashCode
правильно переопределено.