java使用stream()中的reducing实现将名字相同的累加(合并)点餐数量的,早餐,午餐,晚餐(分组计算)

文章介绍了如何使用Java8StreamAPI的groupingBy和reducing方法,分别实现按用户名合并相同名字的点餐数量和按日期类型统计订单总数。展示了两个示例,一个是合并点餐对象,另一个是计算订单数量总和。
摘要由CSDN通过智能技术生成

java使用stream()中的reducing实现将名字相同的累加(合并)点餐数量的,早餐,午餐,晚餐

		//	方法一
		Map<String, PersonFamilyFoodOrderDTO> mergedOrders = personFamilyFoodOrderDTOList.stream()
                .collect(Collectors.groupingBy(PersonFamilyFoodOrderDTO::getUserName, Collectors.reducing(SysFoodOrderController::mergeOrder)))
                .entrySet()
                .stream()
                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().orElse(null)));
        List<PersonFamilyFoodOrderDTO> collect = mergedOrders.values().stream()
                .collect(Collectors.toList());
                
        //	方法二
        List<Optional<PersonFamilyFoodOrderDTO>> collect1 = personFamilyFoodOrderDTOList.stream()
                .collect(Collectors.groupingBy(PersonFamilyFoodOrderDTO::getUserName,
                        Collectors.reducing(SysFoodOrderController::mergeOrder)))
                .values().stream().collect(Collectors.toList());


		private static PersonFamilyFoodOrderDTO mergeOrder(PersonFamilyFoodOrderDTO o1, PersonFamilyFoodOrderDTO o2) {
        return new PersonFamilyFoodOrderDTO(o1.getUserName(),
                o1.getBreakfast() + o2.getBreakfast(),
                o1.getLunch() + o2.getLunch(),
                o1.getDinner() + o2.getDinner(),
                o1.getFamilyBreakfast() + o2.getFamilyBreakfast(),
                o1.getFamilyLunch() + o2.getFamilyLunch(),
                o1.getFamilyDinner() + o2.getFamilyDinner()
                );
    }

通过分组foodMenuDate,foodMenuType来统计OrderNumber总数

Map<String, Integer> sums = sysFoodOrderList.stream()
               .collect(Collectors.groupingBy(p -> p.getFoodMenuDate() + "-" + p.getFoodMenuType()
               ,Collectors.summingInt(SysFoodOrder::getOrderNumber)));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值