Получить ExtraData из MVC5-фреймворка OAuth / OWin провайдер идентификации с внешним провайдером аутентификации

Оригинальный ответ

Да, это возможно:

List<BigDecimal> bdList = new ArrayList<>();
//populate list
BigDecimal result = bdList.stream()
        .reduce(BigDecimal.ZERO, BigDecimal::add);

Что он делает:

  1. Получите List<BigDecimal>.
  2. Включите его в Stream<BigDecimal>
  3. Вызовите метод уменьшения. 3.1. Мы добавляем значение идентичности для добавления, а именно 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.

30
задан Hao Kung 16 September 2013 в 17:35
поделиться