2 回答
TA贡献1801条经验 获得超8个赞
您可以按SimpleEntry两个字段的一对(在此示例中使用)进行分组,计算每个组的数量总和,然后对结果进行流式处理以选择具有最高值的条目:
orders.stream()
.collect(Collectors.groupingBy(
o -> new SimpleEntry<>(o.getDate().getMonth(), o.getCategory()),
Collectors.summingInt(Order::getQuantity)))
.entrySet()
.stream()
.max(Entry.comparingByValue())
.ifPresent(cat -> System.out.println(
"Month: " + cat.getKey().getKey() +
" - Category: " + cat.getKey().getValue() +
" - Quantity: " + cat.getValue()));
使用您的示例数据的输出是:
Month: FEBRUARY - Category: HEADPHONES - Quantity: 9
TA贡献1757条经验 获得超8个赞
这是一个如何仅针对月份执行此操作的示例(可以引入另一个类来组合键以进行聚合):
// month, sum
Map<Integer, Integer> map = orders.stream()
.collect(groupingBy(o -> o.getDate().getMonthValue(), TreeMap::new, summingInt(Order::getQuantity)));
int month = map.entrySet().stream().reduce((s1, s2) -> {
if (s1.getValue() > s2.getValue()) return s1;
else return s2;
}).get().getKey();
为清楚起见,我将其分为两个流,但您可以加入它们。第一个给出订单总和的月份数,第二个是最大的月份值。
添加回答
举报