Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Фільтрація Елементів за Допомогою Методу filter() | Проміжні Операції у Stream API
Stream API

bookФільтрація Елементів за Допомогою Методу filter()

Під час роботи з колекціями даних у Java часто виникає потреба виділити певні елементи, які відповідають заданим умовам. Традиційно для цього використовують цикли та умовні оператори, що робить код більш громіздким. У таких випадках на допомогу приходить метод filter().

Ви вже використовували цей метод у наших прикладах, але ми ще не розглядали детально, який аргумент він приймає. Він приймає функціональний інтерфейс Predicate<T>, який визначає, чи повинен елемент бути включений до результуючого потоку.

Stream<T> filter(Predicate<? super T> predicate);

Тут T — це тип елементів у потоці, а Predicate<? super T> — це умова фільтрації, яка використовується для перевірки кожного елемента.

Практичне застосування

Припустимо, у вас є список співробітників, кожен з яких має name та yearsOfExperience у компанії. Потрібно вибрати лише тих, хто працює у компанії більше 5 років, щоб запропонувати їм бонус або додаткові пільги.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
package 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?

question mark

Що виконує метод filter() у Stream API?

Select the correct answer

question mark

Який тип аргументу приймає метод filter()?

Select the correct answer

question mark

Що відбувається, якщо у методі filter() використати умову, яка завжди повертає false?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 2

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Awesome!

Completion rate improved to 2.33

bookФільтрація Елементів за Допомогою Методу filter()

Свайпніть щоб показати меню

Під час роботи з колекціями даних у Java часто виникає потреба виділити певні елементи, які відповідають заданим умовам. Традиційно для цього використовують цикли та умовні оператори, що робить код більш громіздким. У таких випадках на допомогу приходить метод filter().

Ви вже використовували цей метод у наших прикладах, але ми ще не розглядали детально, який аргумент він приймає. Він приймає функціональний інтерфейс Predicate<T>, який визначає, чи повинен елемент бути включений до результуючого потоку.

Stream<T> filter(Predicate<? super T> predicate);

Тут T — це тип елементів у потоці, а Predicate<? super T> — це умова фільтрації, яка використовується для перевірки кожного елемента.

Практичне застосування

Припустимо, у вас є список співробітників, кожен з яких має name та yearsOfExperience у компанії. Потрібно вибрати лише тих, хто працює у компанії більше 5 років, щоб запропонувати їм бонус або додаткові пільги.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
package 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?

question mark

Що виконує метод filter() у Stream API?

Select the correct answer

question mark

Який тип аргументу приймає метод filter()?

Select the correct answer

question mark

Що відбувається, якщо у методі filter() використати умову, яка завжди повертає false?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 2
some-alt