Русский
Русский
English
Статистика
Реклама

Перевод Optional.stream()

На этой неделе я узнал об одной интересной "новой" возможности Optional, о которой хочу рассказать в этом посте. Она доступна с Java 9, так что новизна ее относительна.

Давайте начнем со следующей последовательности для вычисления общей цены заказа:

public BigDecimal getOrderPrice(Long orderId) {    List<OrderLine> lines = orderRepository.findByOrderId(orderId);    BigDecimal price = BigDecimal.ZERO;           for (OrderLine line : lines) {        price = price.add(line.getPrice());       }    return price;}
  • Предоставьте переменную-аккумулятор для цены

  • Добавьте цену каждой строки к общей цене

В настоящее время, вероятно, более целесообразно использовать стримы вместо итераций. Следующий фрагмент эквивалентен предыдущему:

public BigDecimal getOrderPrice(Long orderId) {    List<OrderLine> lines = orderRepository.findByOrderId(orderId);    return lines.stream()                .map(OrderLine::getPrice)                .reduce(BigDecimal.ZERO, BigDecimal::add);}

Давайте сосредоточимся на переменной orderId : она может содержать null.

Императивный способ обработки nullзаключается в том, чтобы проверить его в начале метода - и в конечном итоге сбросить:

public BigDecimal getOrderPrice(Long orderId) {    if (orderId == null) {        throw new IllegalArgumentException("Order ID cannot be null");    }    List<OrderLine> lines = orderRepository.findByOrderId(orderId);    return lines.stream()                .map(OrderLine::getPrice)                .reduce(BigDecimal.ZERO, BigDecimal::add);}

Функциональный способ заключается в том, чтобы обернуть orderId в Optional. Вот как выглядит код с использованием Optional:

public BigDecimal getOrderPrice(Long orderId) {    return Optional.ofNullable(orderId)                                        .map(orderRepository::findByOrderId)                               .flatMap(lines -> {                                                    BigDecimal sum = lines.stream()                        .map(OrderLine::getPrice)                        .reduce(BigDecimal.ZERO, BigDecimal::add);                return Optional.of(sum);                                       }).orElse(BigDecimal.ZERO);                            }
  1. Оберните orderId в Optional

  2. Найдите соответствующие строки заказа

  3. Используйте flatMap(), чтобы получить Optional<BigDecimal>; map() получит Optional<Optional<BigDecimal>>

  4. Нам нужно обернуть результат в Optional, чтобы он соответствовал сигнатуре метода.

  5. Если Optional не содержит значения, сумма равна 0

Optional делает код менее читабельным! Я считаю, что понятность должна быть всегда важнее стиля кода.

К счастью, Optional предлагает метод stream() (начиная с Java 9). Он позволяет упростить функциональный конвейер:

public BigDecimal getOrderPrice(Long orderId) {    return Optional.ofNullable(orderId)            .stream()            .map(orderRepository::findByOrderId)            .flatMap(Collection::stream)            .map(OrderLine::getPrice)            .reduce(BigDecimal.ZERO, BigDecimal::add);}

Вот краткая информация о типе на каждой строке:

Функциональный код не обязательно означает то, что это также читаемый код. Учитывая последние изменения, я считаю, что это и то, и другое.


Перевод материала подготовлен в рамках курса "Java Developer. Basic". Приглашаем всех желающих на день открытых дверей онлайн, где можно подробнее узнать о формате и программе обучения, а также познакомиться с преподавателем.

Источник: habr.com
К списку статей
Опубликовано: 08.06.2021 20:05:53
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании otus

Программирование

Java

Java development

Api

Functional programming

Optional

Stream

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru