В программировании, когда у нас есть коллекция, иногда нам нужно отфильтровать ту часть, которая соответствует нашим требованиям, и отбросить остальные.
Подробный пример — когда у нас есть список записей пациентов, и мы хотим получить список несовершеннолетних пациентов.
Начните с копирования этого кода в java-файл
public class FilteringPatients {
private static List<Patient> patientsList= Arrays.asList(
new Patient("Norman", 15,210),
new Patient("kai", 17,195),
new Patient("Adam", 21,180)
);
public static class Patient{
private String name;
private int age;
private int roomNumber;
public Patient(String n,int a, int nbr) {
name=n;
age=a;
roomNumber=nbr;
}
public int getAge() {
return age;
}
}
}
Здесь требуется, чтобы возраст был меньше 18 лет.
public static List<Patient> filterUnderagedPatients ( List<Patient> patientsList){
List<Patient> Underaged_Patients= new ArrayList<Patient>();
for (Patient patient: patientsList) {
if(patient.getAge()<18)
Underaged_Patients.add(patient);
}
return Underaged_Patients;
}
Мы можем поступить таким образом или использовать метод фильтрации.
Stream<T> filter(Predicate<? super T> predicate);
Метод filter обычно используется для фильтрации коллекции объектов.
Принятым параметром метода filter является Predicate, давайте рассмотрим его подробнее.
Во-первых, Predicate — это функциональный интерфейс, что означает, что Predicate может быть представлен лямбда-выражением.
Его функциональным методом является test(Object), который принимает один аргумент и возвращает булево значение, обычно используется для проверки истинности или ложности условия.
@FunctionalInterface
public interface Predicate<T
Возьмем предыдущий пример, но на этот раз воспользуемся методом filter с предикатом
public static class UnderagedPatientsPredicate implements Predicate<Patient> {
@Override
public boolean test(Patient patient) {
return patient.getAge()<18;
}
}
public static List<Patient > filter(Predicate<Patient > predicate){
List<Patient> Underaged_list= new ArrayList();
for (Patient patient: patientsList) {
if(predicate.test(patient))
Underaged_list.add(patient);
}
return Underaged_list;
}
Проверим это в основной функции
public static void main(String[] args) {
System.out.println("Using filterUnderagedPatients.");
for (Patient patient : filterUnderagedPatients(patientsList)
) {
System.out.println(patient);
}
System.out.println("Using filter with Predicate.");
for (Patient patient : filter( new UnderagedPatientsPredicate(), patientsList)
) {
System.out.println(patient);
}
}
результат — список несовершеннолетних пациентов
Using filterUnderagedPatients.
Patient{name='Norman', age=15, roomNumber=210}
Patient{name='kai', age=17, roomNumber=195}
Using filter with Predicate.
Patient{name='Norman', age=15, roomNumber=210}
Patient{name='kai', age=17, roomNumber=195}