Файл: Что такое функциональное программирование и где оно применяется.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 243

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


2. BiConsumer accumulator(): Возвращает функцию-аккумулятор, которая добавляет элементы в контейнер.

3. BinaryOperator combiner(): Возвращает функцию-комбинатор, которая объединяет два контейнера для накопления элементов.

4. Function finisher(): Возвращает функцию-завершитель, которая преобразует контейнер для накопления элементов в результат окончательного значения.

5. Set characteristics(): Возвращает набор характеристик коллектора, таких как CONCURRENT, UNORDERED и IDENTITY_FINISH.

Collector позволяет выполнить операцию накопления с помощью метода collect() в Stream API. Он может использоваться для сборки элементов в различные структуры данных, такие как List, Set, Map или пользовательские коллекции.

Collector является мощным инструментом для агрегации данных в стриме и позволяет выполнять различные операции, такие как группировка, подсчет, суммирование, среднее значение и другие операции сокращения данных.

Метод Сollect? Как создать свой Collector?

Метод `collect()` в Stream API используется для выполнения операции накопления элементов стрима с использованием коллектора (`Collector`).

Синтаксис метода `collect()` выглядит следующим образом:

```

R collect(Collector super T, A, R> collector)

```

Он принимает в качестве аргумента коллектор, который определяет, как накоплять элементы стрима и как получить окончательный результат.

Для создания своего собственного коллектора вы можете реализовать интерфейс `Collector`. Вот шаблонный пример создания своего коллектора:

```java

import java.util.*;

import java.util.stream.Collector;

class MyCollector implements Collector, R> {

// Метод supplier создает и возвращает пустой контейнер для накопления элементов

@Override

public Supplier> supplier() {

return ArrayList::new;

}

// Метод accumulator добавляет элементы
в контейнер

@Override

public BiConsumer, T> accumulator() {

return List::add;

}

// Метод combiner объединяет два контейнера для накопления элементов

@Override

public BinaryOperator> combiner() {

return (list1, list2) -> {

list1.addAll(list2);

return list1;

};

}

// Метод finisher преобразует контейнер для накопления элементов в результат окончательного значения

@Override

public Function, R> finisher() {

// Здесь можно выполнить необходимые преобразования для получения окончательного результата

// или просто вернуть полученный список без изменений

return (list) -> (R) list;

}

// Метод characteristics возвращает набор характеристик коллектора

@Override

public Set characteristics() {

// Указываем характеристики вашего коллектора, например, UNORDERED или CONCURRENT

return Collections.emptySet();

}

}

```

Вы можете создать экземпляр своего коллектора `MyCollector` и использовать его в методе `collect()` для накопления элементов стрима:

```java

List numbers = Arrays.asList(1, 2, 3, 4, 5);

List result = numbers.stream()

.collect(new MyCollector<>());

System.out.println(result); // [1, 2, 3, 4, 5]

```

Обратите внимание, что в методе `finisher()` вы должны выполнить необходимые преобразования для получения окончательного результата или просто вернуть контейнер без изменений, если ваш коллектор должен возвращать такой же тип, как и контейнер для накопления (в данном случае `List`).

Класс Optional в Java

Класс `Optional` в Java представляет собой контейнер, который может содержать или не содержать некоторое значение. Он был введен в Java 8 в качестве средства для борьбы с проблемами, связанными с нулевыми значениями (`null`).

Основная цель `Optional` состоит в том, чтобы предоставить более безопасный и явный способ работы с возможным отсутствием значения, чем использование нулевых ссылок. `Optional` может быть использован для обозначения ситуаций, когда значение может быть отсутствующим или присутствовать.



Вот некоторые основные методы и концепции, связанные с `Optional`:

- Создание экземпляра `Optional`:

- `Optional.of(value)`: Создает `Optional`, содержащий заданное значение. Если значение равно `null`, будет выброшено исключение `NullPointerException`.

- `Optional.ofNullable(value)`: Создает `Optional`, содержащий заданное значение. Значение может быть как ненулевым, так и `null`.

- `Optional.empty()`: Создает пустой `Optional` без значения.

- Проверка наличия значения:

- `isPresent()`: Возвращает `true`, если `Optional` содержит значение, и `false`, если `Optional` пустой.

- Получение значения:

- `get()`: Возвращает значение из `Optional`, если оно присутствует. Если `Optional` пустой, будет выброшено исключение `NoSuchElementException`.

- Работа с отсутствующим значением:

- `orElse(defaultValue)`: Возвращает значение из `Optional`, если оно присутствует, иначе возвращает заданное значение по умолчанию.

- `orElseGet(supplier)`: Возвращает значение из `Optional`, если оно присутствует, иначе вызывает заданный поставщик (supplier) и возвращает его результат.

- `orElseThrow(exceptionSupplier)`: Возвращает значение из `Optional`, если оно присутствует, иначе выбрасывает исключение, созданное заданным поставщиком исключений.

`Optional` предоставляет механизм, чтобы избежать использования нулевых ссылок и облегчить обработку ситуаций, когда значение может быть отсутствующим. Это помогает улучшить безопасность и ясность кода, поскольку программисты явно указывают на возможность отсутствия значения и должны явно обрабатывать эту ситуацию.

Пример использования `Optional`:

```java

Optional optionalValue = Optional.of("Hello");

optionalValue.ifPresent(value -> System.out.println(value)); // Выводит: Hello

Optional emptyOptional = Optional.empty();

System.out.println(emptyOptional.orElse("Default Value")); // Выводит: Default Value

Optional nullableOptional =