背景:在写朴友项目中的推荐动态的时候遇到的
代码:
@Override
public PageResult findRecommendMovements(Integer page, Integer pagesize) {
//1.从Redis中获取推荐数据 TODO 这里在redis去存储对应的推荐内容还没做
String redisKey = Constants.MOVEMENTS_RECOMMEND + UserHolder.getUserId();
String redisValue = redisTemplate.opsForValue().get(redisKey);
//2.判断推荐数据是否存在
List<Article> articleList = Collections.EMPTY_LIST;
List<Long> ids = Collections.EMPTY_LIST;
// TODO 目前以下判断只有第一个通过 ,第二个判断对应的功能还没写
if (StringUtils.isEmpty(redisValue)) {
//3.不存在,调用API随机构造10条数据
articleList = articleApi.randomMovements(pagesize);
//获取这些动态的用户ID
ids = CollUtil.getFieldValues(articleList, "userId", Long.class);
} else {
//4.存在,对pid进行处理
String[] values = redisValue.split(",");
//判断当前页的起始条数是否小于数组总数
if ((page - 1) * pagesize < values.length) {
List<Long> pids = Arrays.stream(values).skip((page - 1) * pagesize).limit(pagesize)
.map(e -> Long.valueOf(e))
.collect(Collectors.toList());
//5.调用API根据pid数组查询动态数据
articleList = articleApi.findMovementsByPids(pids);
ids = CollUtil.getFieldValues(articleList, "userId", Long.class);
}
}
return getPageResult(ids, page, pagesize, articleList);
}
/**
* 封装对应文章的用户信息
* 以及其他有需要的信息
* */
private PageResult getPageResult(List<Long> userIds, Integer page, Integer pagesize, List<Article> articleList) {
if (articleList == null) {
return new PageResult();
}
// 调用api获取好友的个人信息
Map<String, UserDetailInfo> map = userDetailInfoApi.findByIds(userIds, new UserDetailInfo());
// 设置返回信息
List<ArticleVo> voList = new ArrayList<>();
// 遍历每一个动态对象,每个动态对象只能属于某一个用户
for (Article article : articleList) {
if (article != null) {
System.out.println(map.toString());
System.out.println(article.getUserId());
UserDetailInfo userDetailInfo = map.get(article.getUserId().toString());
System.out.println(userDetailInfo);
if (userDetailInfo!=null) {
// 封装userInfo和movement对象到vo对象中
ArticleVo vo = ArticleVo.init(map.get(article.getUserId().toString()), article);
// 修复点赞状态bug,判断存入Redis中的hashKey是否存在
String key = Constants.MOVEMENTS_INTERACT_KEY + article.getId().toHexString();
String hashKey = Constants.MOVEMENT_LIKE_HASHKEY + UserHolder.getUserId();
// 判断是否含有对应的键
Boolean flag = redisTemplate.opsForHash().hasKey(key, hashKey);
if (flag) {
vo.setHasLiked(1);
}
voList.add(vo);
}
}
}
return new PageResult(page, pagesize, 0L, voList);
}
在上述代码getPageResult方法中,如下图,:
出现的问题,如果map集合的key为long型时,会出现map集合取出key对应为null的结果,原因在网上找的说是,long作为key时可能在取的时候会转化为integer类型。
目前的解决方法(再上图中以写出):
map中的key作为了string类型。