Нужна ли реализация интерфейса Money?

126
13 марта 2018, 02:20

Есть следующие интерфейсы, необходимо написать метод Money calculateTotalPrice(Collection shipments), возвращающий сумму стоимости всех товаров (price*amount) с использованием Stream API. Я с Stream API на вы. Нужно ли писать реализацию интерфейса Money? Необходимо ли как-то использовать объект ZERO?

public interface Shipment {
    List<Product> getProducts();
}
public interface Product {
    Money getPrice();
    BigDecimal getAmount();
}
public interface Money {
    Money ZERO = new ZeroMoneyImpl();
    Money add(Money other);
    Money multiply(BigDecimal multiplier);
}
Answer 1

Предложу такой вариант:

Money calculateTotalPrice(Collection<Shipment> shipments){
    return shipments.stream()
            .map(Shipment::getProducts)
            .flatMap(Collection::stream)
            .map(product -> product.getPrice().multiply(product.getAmount()))
            .reduce(Money::add)
            .orElseThrow(RuntimeException::new); // можно так или просто вызвать get() или orElse(null) тут от архитектуры зависит
}

По поводу реализации интерфейса, он конечно вам понадобится, но не для этой цели. Тут вам без разницы какая реализация будет, у вас есть контракт в виде интерфейса. О реализации будет заботиться тот, кот будет вызывать ваш метод.

READ ALSO
submit и invoke в ForkJoinPool

submit и invoke в ForkJoinPool

Подскажите наиболее просто и с примерами если можно разницу между submit и invoke в ForkJoinPool и когда их лучше всего использоватьШот гугл не помогает...

129
Drag &amp; Drop Selenium WebDriver + java

Drag & Drop Selenium WebDriver + java

Пробовал следующее:

124
Ошибка при скачивании в sardine java

Ошибка при скачивании в sardine java

Получаю ошибку при скачивании файлов с некоторыми расширениямиЕсли скачиваю файл с расширением txt, xlsx или zip - ошибок нету

149
Как вывести несколько значений сразу в popup окне

Как вывести несколько значений сразу в popup окне

ЗдравствуйтеЕсть код в котором при выборе чекбокса, его значение выводиться в popup окне

209