С каким функциональным интерфейсом работает метод filter() в Java Stream API?

«С каким функциональным интерфейсом работает метод filter() в Java Stream API?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод filter() в Java Stream API работает с функциональным интерфейсом Predicate<T>.

Почему именно Predicate?

  • Predicate<T> имеет единственный абстрактный метод boolean test(T t), который принимает элемент потока и возвращает boolean.
  • Если test() возвращает true, элемент проходит фильтр и остается в потоке; если false — элемент отбрасывается.

Пример использования:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Alex");
List<String> longNames = names.stream()
    .filter(name -> name.length() > 3) // Лямбда-выражение для Predicate<String>
    .collect(Collectors.toList());
// Результат: ["Alice", "Charlie", "Alex"]

Более сложный пример с составным предикатом:

Predicate<String> lengthPredicate = s -> s.length() > 3;
Predicate<String> startsWithAPredicate = s -> s.startsWith("A");

List<String> result = names.stream()
    .filter(lengthPredicate.and(startsWithAPredicate))
    .collect(Collectors.toList());
// Результат: ["Alice", "Alex"]