Какую функцию выполняет .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 шт):
Метод 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 и выбрать соответствующее преобразование.