Фильтрация с помощью предикатов

В программировании, когда у нас есть коллекция, иногда нам нужно отфильтровать ту часть, которая соответствует нашим требованиям, и отбросить остальные.

Подробный пример — когда у нас есть список записей пациентов, и мы хотим получить список несовершеннолетних пациентов.

Начните с копирования этого кода в 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}
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий