Да, это возможно:
List<BigDecimal> bdList = new ArrayList<>();
//populate list
BigDecimal result = bdList.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add);
Что он делает:
List<BigDecimal>
. Stream<BigDecimal>
BigDecimal.ZERO
. 3.2. Мы указываем BinaryOperator<BigDecimal>
, который добавляет два BigDecimal
, через ссылку на метод BigDecimal::add
. Я вижу, что вы добавили новые данные, поэтому новый ответ станет следующим:
List<Invoice> invoiceList = new ArrayList<>();
//populate
Function<Invoice, BigDecimal> totalMapper = invoice -> invoice.getUnit_price().multiply(invoice.getQuantity());
BigDecimal result = invoiceList.stream()
.map(totalMapper)
.reduce(BigDecimal.ZERO, BigDecimal::add);
Это в основном то же самое, за исключением того, что я добавил переменную totalMapper
, которая имеет функцию от Invoice
до BigDecimal
и возвращает общую стоимость этого счета.
Затем я получаю Stream<Invoice>
, сопоставляю его с Stream<BigDecimal>
, а затем уменьшаю его до BigDecimal
.
Теперь, из точки проектирования ООП, я бы посоветовал вам также использовать метод total()
, который вы уже определили, тогда он становится еще проще:
List<Invoice> invoiceList = new ArrayList<>();
//populate
BigDecimal result = invoiceList.stream()
.map(Invoice::total)
.reduce(BigDecimal.ZERO, BigDecimal::add);
Здесь мы непосредственно используем ссылку на метод в методе map
.