Фільтрація Елементів за Допомогою Методу filter()
Свайпніть щоб показати меню
Під час роботи з колекціями даних у Java часто виникає потреба виділити певні елементи, які відповідають визначеним умовам. Традиційно для цього використовують цикли та умовні оператори, що робить код більш громіздким. У таких випадках на допомогу приходить метод filter().
Ви вже використовували цей метод у наших прикладах, але ми ще не розглядали детально, який аргумент він приймає. Він приймає функціональний інтерфейс Predicate<T>, який визначає, чи повинен елемент бути включений до результуючого потоку.
Stream<T> filter(Predicate<? super T> predicate);
Тут T — це тип елементів у потоці, а Predicate<? super T> — це умова фільтрації, яка використовується для перевірки кожного елемента.
Практичне застосування
Припустимо, у вас є список співробітників, кожен з яких має name та yearsOfExperience у компанії. Потрібно вибрати лише тих, хто працює у компанії більше 5 років, щоб запропонувати їм бонус або додаткові пільги.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; class Employee { private final String name; private final int yearsOfExperience; public Employee(String name, int yearsOfExperience) { this.name = name; this.yearsOfExperience = yearsOfExperience; } public String getName() { return name; } public int getYearsOfExperience() { return yearsOfExperience; } @Override public String toString() { return name + " (" + yearsOfExperience + " years)"; } } public class Main { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee("John", 6), new Employee("Sarah", 4), new Employee("Mike", 7), new Employee("Anna", 3), new Employee("Tom", 8) ); // Filtering employees with more than 5 years of experience List<Employee> experiencedEmployees = employees.stream() .filter(e -> e.getYearsOfExperience() > 5) .toList(); System.out.println("Experienced employees: " + experiencedEmployees); } }
У цьому прикладі створюється стрім із співробітників за допомогою stream(). Далі, використовуючи метод filter, відбираються співробітники, які мають понад 5 років досвіду.
Результатом є новий список, що містить лише тих співробітників, які відповідають цій умові.
Коли використовувати filter
У більшості випадків доцільно використовувати filter() на початку, щоб зменшити обсяг даних для подальших операцій. Це підвищує продуктивність, оскільки наступні операції виконуватимуться над меншим набором даних.
Приклад
Якщо у вас є список співробітників і потрібно спочатку відфільтрувати тих, хто має понад 5 років досвіду, а потім перетворити решту співробітників у інший формат, доцільно почати саме з фільтрації.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Як видно з цього прикладу, спочатку розміщують filter(), а потім метод map(), оскільки це дозволяє спочатку зменшити кількість елементів для обробки. Спочатку фільтруються співробітники з понад 5 роками досвіду, а потім отримуються їхні імена.
Такий порядок операцій є ефективним, оскільки запобігає непотрібній обробці даних під час трансформації.
1. Що виконує метод filter() у Stream API?
2. Який тип аргументу приймає метод filter()?
3. Що відбудеться, якщо у методі filter() використати умову, яка завжди повертає false?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат