Тип Optional. Метод collect
Тип Optional. Метод collect – онлайн уроки java для дітей
Тип `Optional` в Java
`Optional` — це обгортка (контейнер), яка може містити або не містити значення. Він використовується для уникнення проблем з `NullPointerException` та для явного вказання на можливу відсутність значення.
Основні методи `Optional`
- `empty()` — повертає порожній `Optional` без значення.
Optional<String> emptyOpt = Optional.empty(); - `of(T value)` — створює `Optional`, що містить непорожнє значення. Якщо передати `null`, виникне `NullPointerException`.
Optional<String> opt = Optional.of(“Hello”); - `ofNullable(T value)` — створює `Optional`, який може містити значення або бути порожнім, якщо передане значення є `null`.
Optional<String> opt = Optional.ofNullable(null); // Порожній Optional - `isPresent()` — повертає `true`, якщо значення присутнє, інакше `false`.
if (opt.isPresent()) {
System.out.println(“Значення є”);
} - `ifPresent(Consumer<? super T> action)` — виконує дію, якщо значення присутнє.
opt.ifPresent(value -> System.out.println(value)); - `orElse(T other)` — повертає значення, якщо воно присутнє, або інше значення, якщо значення відсутнє.
String result = opt.orElse(“Значення відсутнє”); - `orElseGet(Supplier<? extends T> other)` — повертає значення або обчислює інше значення, якщо `Optional` порожній.
String result = opt.orElseGet(() -> “Значення відсутнє”); - `orElseThrow(Supplier<? extends X> exceptionSupplier)` — повертає значення, якщо воно є, або кидає виняток.
String result = opt.orElseThrow(() -> new IllegalArgumentException(“Значення відсутнє”)); - `map(Function<? super T, ? extends U> mapper)` — перетворює значення, якщо воно присутнє.
Optional<Integer> lengthOpt = opt.map(String::length); - `filter(Predicate<? super T> predicate)` — повертає `Optional` з тим самим значенням, якщо воно відповідає умові, або порожній `Optional`.
Optional<String> filteredOpt = opt.filter(value -> value.length() > 3);
Приклад використання `Optional`:
import java.util.Optional;
public class Main {
public static void main(String[] args) {
Optional<String> opt = Optional.ofNullable(“Java Optional Example”);
// Використання ifPresent
opt.ifPresent(System.out::println);
// Використання orElse
String result = opt.orElse(“Default Value”);
System.out.println(result);
}
}
Метод `collect` в Stream API
Метод `collect()` в Stream API використовується для збирання елементів потоку в колекцію або інші структури даних. Це термінальна операція, яка завершує потік і повертає результат.
Синтаксис:
<R, A> R collect(Collector<? super T, A, R> collector);
Метод `collect()` приймає об’єкт `Collector`, який визначає, як елементи потоку будуть збиратися. Java надає ряд вбудованих колекторів у класі `Collectors`.
Основні колектори з `Collectors`:
- Збирання в список:
List<String> list = stream.collect(Collectors.toList()); - Збирання в множину:
Set<String> set = stream.collect(Collectors.toSet()); - Збирання в рядок із розділювачем:
String result = stream.collect(Collectors.joining(“, “)); - Групування елементів за ключем:
Map<Integer, List<String>> groupedByLength = stream.collect(Collectors.groupingBy(String::length)); - Збирання в мапу:
Map<String, Integer> map = stream.collect(Collectors.toMap(str -> str, String::length));
Приклад використання методу `collect`:
Збирання елементів потоку в список:
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.length() > 4)
.collect(Collectors.toList());
System.out.println(result); // Виведе: [Ольга, Марія]
}
}
Об’єднання елементів потоку в рядок:
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(“Ольга”, “Іван”, “Марія”, “Олег”);
// Об’єднання імен у рядок із комами
String result = names.stream()
.collect(Collectors.joining(“, “));
System.out.println(result); // Виведе: Ольга, Іван, Марія, Олег
}
}
Групування елементів:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList(“Ольга”, “Іван”, “Марія”, “Олег”);
// Групування імен за їхньою довжиною
Map<Integer, List<String>> groupedByLength = names.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(groupedByLength); // Виведе: {4=[Іван, Олег], 5=[Ольга, Марія]}
}
}
Висновок
- `Optional` — це контейнер, який допомагає працювати з відсутніми значеннями, уникаючи помилок із `null`.
- `collect()` — це термінальна операція в Stream API, що збирає елементи потоку в колекції або інші структури даних за допомогою колекторів із `Collectors`.
Ці дві концепції широко використовуються для підвищення ефективності й зручності обробки даних у Java.