Как передавать удаленные элементы в java removeIf?

#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 правильно переопределено.