我当前的尝试是基于双重类型的类成员:
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
来重构它?
答案 0 :(得分:1)
如果您正在寻找总计Collector
的{{1}},则应该可以:
BigDecimal
答案 1 :(得分:1)
您可以这样重构它,
shopping.entrySet().stream()
.collect(
Collectors.groupingBy(Map.Entry::getKey,
Collectors.flatMapping(
e -> e.getValue().entrySet().stream()
.map(innerEntry -> innerEntry.getKey().getPrice()
.multiply(BigDecimal.valueOf(innerEntry.getValue()))),
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))))
.entrySet().stream()
.max(Map.Entry.comparingByValue()).get().getKey();
您在这里不需要任何其他mapping
Collector
。仅使用map
运算符即可根据您的计算将您的Map.Entry
转换为BigDecimal
,并将该Stream<BigDecimal>
向下传递。最终归约运算符在这里完成了the俩。零是此总和的良好标识元素。