Какую функцию выполняет .filter(fieldNames::remove)?

Есть следующая часть кода на Java

List<String> fieldNames = new ArrayList<>(allFields.size() + 10);

List<String> result = PRE_SORTED_FIELDS_LIST
                .stream()
                .filter(fieldNames::remove)
                .collect(Collectors.toList());

Правильно ли я понимаю, что строка .filter(fieldNames::remove) выполнят фильтрацию значений в List<String> fieldNames и возращает в .collect(Collectors.toList()); только те значения, которые дали результат true а те значения которые дали false были удалены методом remove?

Вопрос возможно банальный, но до этого с Java ни разу не работал.


Ответы (1 шт):

Автор решения: Vadik

Метод filter преобразует стрим в новый стрим, в котором будут только те элементы, которые удовлетворяют условию. Стримы в Java ленивые: пока не вызовется collect, ничего не начнет считаться.

Метод remove ищет переданный объект в коллекции и удаляет его, возвращая true, если объект удалось найти. И false — если такого объекта нет.

Конструкция fieldNames::remove в Java — это метод-референс. Чтобы было понятнее, его можно развернуть в обычную лямбду:

.filter(item -> fieldNames.remove(item))

Чтобы совсем все было понятно, весь ваш код можно преобразовать в обычный си-стайл:

List<String> result = new ArrayList<>();
for (String item : PRE_SORTED_FIELDS_LIST) {
    if (fieldNames.remove(item)) {
        result.add(item);
    }
}

Все эти преобразования автоматически за вас может сделать Intellij IDEA, если вы работаете в ней. Для этого нажать Alt + Enter и выбрать соответствующее преобразование.

→ Ссылка