Моя текущая попытка основана на членах класса двойного типа:
public Client whoPaidTheMost() {
/*METHOD EXPLOITING STREAM API*/
return shopping.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.flatMapping(e -> e.getValue().entrySet().stream(),
Collectors.summingDouble(e->e.getKey().getPrize() * e.getValue())))) /*should be refactored*/
.entrySet().stream()
.max(Comparator.comparingDouble(Map.Entry::getValue))/*should be refactored*/
.get()
.getKey();
}
покупки - это, в основном, карта: Map<Client, Map<Product,Integer>>
,
- Внешний ключ представляет Клиента
- Внутренний Ключ представляет Продукт
- значение внутренних карт (целое число) представляет номер указанного продукта, принадлежащего конкретному клиенту
Товар члены класса имя, категория, цена (ранее двойного типа) - хотите преобразовать предоставленный код в код, используя цену в качестве типа BigDecimal
Как я могу заставить этот код работать и для BigDecimals -?
По сути, я рефакторинг этого арлеади:
Client client = shopping.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.flatMapping(e -> e.getValue().entrySet().stream(),
Collectors.mapping(e -> BigDecimal.valueOf(new Long(e.getValue())).multiply(e.getKey().getPrize()),
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))))
.entrySet().stream()
.max((e1, e2) -> (e1.getValue().compareTo(e2.getValue())))
.get()
.getKey();
Все еще задаетесь вопросом, возможно ли это изменить, не используя: Collectors.mapping(e -> BigDecimal.valueOf(new Long(e.getValue())).multiply(e.getKey().getPrize())
до Collectors.reducing
?