Ответ
Метод 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"]