较为优雅的业务逻辑操作
1、需求:查询用户已有的优惠券信息
- 第一步:我们去数据库中查询用户有的所有优惠券
- 第二步:我们在缓存中提取出一个以优惠券id为Key,以优惠券实体为value的Map。
- 第三步:优雅的通过用户有的优惠券id来过滤并获取我们需要的特殊字段
- 总结:代码还是较为优雅
@Override public List<UserCouponInfoDto> userCouponList(Integer userId) { List<UserCouponInfoDto> dtos = Lists.newArrayList(); if(userId==null){ return dtos; } List<TUserCoupon> userCoupon = getUserCoupon(userId); if(CollectionUtils.isEmpty(userCoupon)){ return dtos; } Map<Integer,TCoupon> idCouponMap = getCouponMap(userCoupon); //封装coupon return wrapCoupon(userCoupon,idCouponMap); } private Map<Integer,TCoupon> getCouponMap(List<TUserCoupon> userCoupon){ Set<Integer> couponIds = getCouponIds(userCoupon); List<TCoupon> coupons = getCouponListByIds(StringUtils.join(couponIds,",")); Map<Integer,TCoupon> idCouponMap = couponList2Map(coupons); return idCouponMap; } private Map<Integer,TCoupon> couponList2Map(List<TCoupon> coupons){ return coupons.stream().collect(Collectors.toMap(o -> o.getId(),o -> o)); } private List<TUserCoupon> getUserCoupon(Integer userId){ //查出用户未使用的券 TUserCouponExample example = new TUserCouponExample(); example.createCriteria().andUserIdEqualTo(userId).andStatusEqualTo(0); List<TUserCoupon> userCoupon = tUserCouponMapper.selectByExample(example); return userCoupon; } /** *获取couponIds */ private Set<Integer> getCouponIds(List<TUserCoupon> userCoupons){ Set<Integer> couponIds= userCoupons.stream().map(userCoupon -> userCoupon.getCouponId()).collect(Collectors.toSet()); return couponIds; } private List<UserCouponInfoDto> wrapCoupon(List<TUserCoupon> userCoupons,Map<Integer,TCoupon> idCouponMap){ List<UserCouponInfoDto> dtos = userCoupons.stream().map(userCoupon -> { UserCouponInfoDto dto = new UserCouponInfoDto(); int couponId = userCoupon.getCouponId(); TCoupon coupon = idCouponMap.get(couponId); dto.setAchieveAmount(coupon.getAchieveAmount()); dto.setReduceAmount(coupon.getReduceAmount()); BeanUtils.copyProperties(userCoupon,dto); return dto; }).collect(Collectors.toList()); return dtos; }
StringUtils.join()方法
List<String> list = new ArrayList<>(); list.add("Mxy"); list.add("StringUtils"); list.add("join"); String join = StringUtils.join(list,"-");//传入String类型的List集合,使用"-"号拼接 System.out.println(join); String[] s = new String[]{"Yuan","Mxy"};//传入String类型的数组,使用"-"号拼接 String join2 = StringUtils.join(s,"-"); System.out.println(join2);
结果如下:
Mxy-StringUtils-join Yuan-Mxy
2、使用Redis的SortedSet来实现用户动态领取优惠券
/** * 查询coupon公告栏,前10条数据 */ public List<String> queryCouponList(){ //分数从高到低进行排序 Set<String> couponSet = redisTemplate.opsForZSet().reverseRange("couponSet",0,-1); //获取set里面 前N条数据 return couponSet.stream().limit(10).collect(Collectors.toList()); } /** * 接收coupon优惠券核销mq的时候被调用,以时间窗口展示前N条数据,userCouponStr代表userId_couponId */ public void updateCoupon(String userCouponStr){ redisTemplate.opsForZSet().add(COUPON,userCouponStr,System.currentTimeMillis()); Set<String> couponSet = redisTemplate.opsForZSet().range(COUPON,0,-1); if(couponSet.size()>COUPON_NUM){ String remUserCouponStr = couponSet.stream().findFirst().get(); redisTemplate.opsForZSet().remove(COUPON,remUserCouponStr); } }
测试一下
@Test public void contextLoads() { couponService.updateCoupon("1"); couponService.updateCoupon("2"); couponService.updateCoupon("3"); couponService.updateCoupon("4"); couponService.updateCoupon("5"); couponService.updateCoupon("6"); System.err.println("hello world"); } @Test public void contextLoads1() { System.err.println(JSON.toJSONString(couponService.queryCouponList())); }
测试效果
本文作者为DBC,转载请注明。