если все, что вы хотите сделать, это распечатать на консоль, то это можно сделать следующим образом:
invoiceList.forEach(i -> System.out.println(i.getName() + " " + (i.getPrice() * i.getQty())));
Если нет, тогда читайте дальше:
Использованиеколлектор toMap
Map<String, Double> result =
invoiceList.stream()
.collect(Collectors.toMap(Invoice::getName,
e -> e.getPrice() * e.getQuantity()));
В основном создается карта, в которой ключами являются имена Invoice
, а значения - это умножение цены и количества счета на данное значение Invoice
.
Использование коллектора groupingBy
Однако, если может быть несколько счетов с одинаковым именем, вы можете использовать коллектор groupingBy
вместе с summingDouble
какнижестоящий коллектор:
Map<String, Double> result =
invoiceList.stream()
.collect(groupingBy(Invoice::getName,
Collectors.summingDouble(e -> e.getPrice() * e.getQuantity())));
Группирует Invoice
по их именам, а затем для каждой группы суммирует результат e.getPrice() * e.getQuantity()
.
Обновление:
, если вы хотите, чтобы версия toMap
и результат были отфильтрованы, а затем отсортированы по возрастанию значения, это можно сделать следующим образом:
Map<String, Double> result = invoiceList.stream()
.filter(e -> e.getPrice() * e.getQuantity() > 100)
.sorted(Comparator.comparingDouble(e -> e.getPrice() * e.getQuantity()))
.collect(Collectors.toMap(Invoice::getName,
e -> e.getPrice() * e.getQuantity(),
(left, right) -> left,
LinkedHashMap::new));
или с groupingBy
подходом:
Map<String, Double> result =
invoiceList.stream()
.collect(groupingBy(Invoice::getName,
Collectors.summingDouble(e -> e.getPrice() * e.getQuantity())))
.entrySet()
.stream()
.filter(e -> e.getValue() > 100)
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue, (left, right) -> left,
LinkedHashMap::new));