Есть следующие интерфейсы, необходимо написать метод 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);
}
Предложу такой вариант:
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) тут от архитектуры зависит
}
По поводу реализации интерфейса, он конечно вам понадобится, но не для этой цели. Тут вам без разницы какая реализация будет, у вас есть контракт в виде интерфейса. О реализации будет заботиться тот, кот будет вызывать ваш метод.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите наиболее просто и с примерами если можно разницу между submit и invoke в ForkJoinPool и когда их лучше всего использоватьШот гугл не помогает...
Получаю ошибку при скачивании файлов с некоторыми расширениямиЕсли скачиваю файл с расширением txt, xlsx или zip - ошибок нету
ЗдравствуйтеЕсть код в котором при выборе чекбокса, его значение выводиться в popup окне