java Map集合遇到的坑

背景:在写朴友项目中的推荐动态的时候遇到的

代码:

@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类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值