Список Java keepAll()

В Java метод ArrayList.retainAll() сохраняет только те элементы в этом списке, которые содержатся в указанной коллекции. Все остальные элементы удаляются из списка. Этот метод является полной противоположностью методу removeAll().

1. Синтаксис

Синтаксис использования метода remainAll() следующий:

boolean retainAll(Collection<?> c);

Аргумент метода – коллекция, содержащая элементы, которые необходимо сохранить из этого списка.
Метод возвращает значение – true, если этот список изменился в результате вызова.
Метод выдает – ClassCastException, если класс элемента этого списка несовместим с указанной коллекцией. Он также может выдать NullPointerException, если этот список содержит нулевой элемент, а указанная коллекция не допускает нулевые элементы.

2. Программа Java для использования метода remainAll()

В следующей программе у нас есть два списка. Когда мы вызываем list1.retainAll(list2), программа оставляет только те элементы в list1, которые также присутствуют в list2.

List<Integer> list1 = new ArrayList<>(Stream.of(1, 2, 3, 4, 5).toList());List<Integer> list2 = new ArrayList<>(Stream.of(1, 2, 3, 6, 7).toList());list1.retainAll(list2);System.out.println(list1); //[1, 2, 3]System.out.println(list2); //[1, 2, 3, 6, 7]

3. Как работает remainAll()?

Внутри remainAll() перебирает все элементы списка. Для каждого элемента он передает элемент в метод contains() сбора аргументов.

Если элемент не найден в коллекции аргументов, он перестраивает индекс. Если элемент найден, он сохраняет элемент внутри резервного массива.

public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, true);}private boolean batchRemove(Collection<?> c, boolean complement) {final Object[] elementData = this.elementData;int r = 0, w = 0;boolean modified = false;try {for(; r < size; r++)if(c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.if(r != size) {System.arraycopy(elementData, r,elementData, w,size - r);w += size - r;}if(w != size) {// clear to let GC do its workfor(int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;}

Вот и все о методе ArrayList remainAll() в Java.

Исходный код на Github

Прокрутить вверх