较为优雅的业务逻辑操作
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,转载请注明。
