Фільтрування. Сортування

Прокрутити вниз

Фільтрування, перебір елементів та відображення/сортування у 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 і дозволяють ефективно обробляти та трансформувати дані.

Фільтрування, перебір елементів та відображенняСортування