Фільтрування. Сортування
Фільтрування, перебір елементів та відображення/сортування у Stream API
Stream API в Java пропонує набір функцій для ефективної обробки даних у потоках. Розглянемо три основні операції, що використовуються при роботі з потоками: фільтрування, перебір (ітерація), відображення (mapping) і сортування.
1. Фільтрування (`filter`)
Метод `filter()` використовується для відбору елементів потоку на основі певної умови (логічного виразу). Він приймає як параметр об’єкт типу `Predicate`, який визначає умову, і повертає новий потік з тими елементами, що задовольняють цю умову.
Приклад фільтрації:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Фільтруємо парні числа
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0) // умова: число парне
.collect(Collectors.toList());
System.out.println(“Парні числа: ” + evenNumbers);
}
}
Виведення:
Парні числа: [2, 4, 6, 8, 10]
У цьому прикладі метод `filter()` відбирає лише ті елементи, що задовольняють умову `n % 2 == 0`, тобто парні числа.
2. Перебір елементів (`forEach`)
Метод `forEach()` використовується для виконання певної дії над кожним елементом потоку. Це кінцева операція, що не повертає новий потік, а просто виконує передану дію для кожного елемента.
Приклад перебору елементів:
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList(“Ольга”, “Іван”, “Марія”, “Олег”);
// Перебираємо елементи і виводимо на екран
names.stream()
.forEach(name -> System.out.println(“Привіт, ” + name + “!”));
}
}
Виведення:
Привіт, Ольга!
Привіт, Іван!
Привіт, Марія!
Привіт, Олег!
У цьому прикладі для кожного елемента списку імен виконується дія, яка виводить повідомлення на екран.
3. Відображення (mapping) (`map`)
Метод `map()` використовується для перетворення елементів потоку. Він приймає функцію типу `Function`, яка перетворює кожен елемент потоку і повертає новий потік із перетвореними елементами.
Приклад відображення:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList(“Ольга”, “Іван”, “Марія”, “Олег”);
// Відображаємо кожне ім’я у верхній регістр
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(“Імена у верхньому регістрі: ” + upperCaseNames);
}
}
Виведення:
Імена у верхньому регістрі: [ОЛЬГА, ІВАН, МАРІЯ, ОЛЕГ]
У цьому прикладі ми використовуємо метод `map()`, щоб перетворити всі імена на верхній регістр.
4. Сортування (`sorted`)
Метод `sorted()` використовується для сортування елементів потоку. Він може використовувати природний порядок сортування елементів (якщо вони реалізують інтерфейс `Comparable`) або приймати компаратор для визначення власного порядку сортування.
Приклад сортування:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList(“Ольга”, “Іван”, “Марія”, “Олег”);
// Сортуємо імена за алфавітом
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(“Сортовані імена: ” + sortedNames);
}
}
Виведення:
Сортовані імена: [Іван, Марія, Олег, Ольга]
У цьому прикладі `sorted()` сортує імена в алфавітному порядку.
Сортування з використанням компаратора:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList(“Ольга”, “Іван”, “Марія”, “Олег”);
// Сортуємо імена за довжиною
List<String> sortedByLength = names.stream()
.sorted((s1, s2) -> Integer.compare(s1.length(), s2.length()))
.collect(Collectors.toList());
System.out.println(“Імена, сортовані за довжиною: ” + sortedByLength);
}
}
Виведення:
Імена, сортовані за довжиною: [Іван, Олег, Ольга, Марія]
У цьому прикладі ми використовуємо власний компаратор для сортування імен за довжиною.
Комбінування операцій
Операції в Stream API можна комбінувати, створюючи більш складні ланцюги обробки даних. Ось приклад комбінування фільтрації, відображення та сортування:
Приклад комбінованих операцій:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList(“Ольга”, “Іван”, “Марія”, “Олег”);
// Фільтруємо імена на букву “О”, перетворюємо їх у верхній регістр і сортуємо
List<String> result = names.stream()
.filter(name -> name.startsWith(“О”))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
System.out.println(“Результат: ” + result);
}
}
Виведення:
Результат: [ОЛЕГ, ОЛЬГА]
У цьому прикладі ми відбираємо імена, які починаються на букву “О”, перетворюємо їх на великі літери і сортуємо за алфавітом.
Висновок
- Фільтрування (`filter`) дозволяє відбирати елементи потоку на основі умов.
- Перебір елементів (`forEach`) використовується для виконання дії над кожним елементом потоку.
- Відображення (`map`) перетворює елементи потоку на інші форми.
- Сортування (`sorted`) впорядковує елементи в природному або заданому порядку.
Ці операції є основою роботи з потоками в Stream API і дозволяють ефективно обробляти та трансформувати дані.