【Hutool工具类的使用】

1. 前言

最近在做项目的时候频繁使用到Hutool工具类,里面有很多方法非常好用,因此准备分类整理下来,每学到一个新的就整理一下,正好结合项目,印象更加深刻。

2. 集合操作CollUtil

2.1 从对象集合中根据某一个字段获取到属性的集合

CollUtil.getFieldValues(对象集合, "要提取的字段名称", 返回集合的泛型);

案例:这是示例的实体类

@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "recommend_user")
public class RecommendUser implements Serializable {
    @Id
    private ObjectId id; //主键id
    private Long userId; //推荐的用户id
    private Long toUserId; //用户id
    private Double score =0d; //推荐得分
    private String date; //日期
}

现在有一个RecommendUser的List,想要集合中每一个对象的UserId属性提取出来生成一个新的List,可以使用下面的代码

List<Long> ids = CollUtil.getFieldValues(items, "userId", Long.class);

2.1 以对象集合中某一字段为key,创建Map

CollUtil.fieldValueMap(对象集合, "字段名称");

实例:和上面一样,如果要以RecommendUser 的userId作为key,value为对应的RecommendUser 对象,那么就可以这样写

Map<Long, RecommendUser> map = CollUtil.fieldValueMap(list, "id");

3. 分页操作 PageUtil

3.1 根据记录总数和页大小计算总页数

PageUtil.totalPage(记录总数, 页大小);

实例:在探花交友项目中的小视频模块,需要从Redis中获取到所有的推荐视频,如果推荐视频都显示完毕,则从数据库中按照时间顺序倒叙读取。前端传递页号和页大小。

存在的问题:假设目前Redis中有推荐的视频,用户进行分页查询,查询到第3页的时候,Redis中所有推荐的视频都读取完毕了,此时需要从数据库中分页查询。此时前端传递的页号为3,但是从数据库中肯定要从第一页查询。因此需要用户传递的page - Redis中所有推荐视频所占据的页数=数据库的页号

public PageResult getVideos(Integer page, Integer pagesize) {
    // 1. 获取用户id
    Long userId = UserHolder.getUserId();
    // 2. 根据用户Id 到redis中查询数据 判断推荐信息是否存在
    String key = Constants.VIDEOS_RECOMMEND + userId;
    String recommendStr = redisTemplate.opsForValue().get(key);
    List<Video> videoList = new ArrayList<>();
    int redisTotalPage = 0;
    if (StringUtils.isNotEmpty(recommendStr)) {
        String[] split = recommendStr.split(",");
        // 判断是否还需要分页
        if ((page - 1) * pagesize < split.length) {
            List<Long> vids = Arrays.stream(split)
                    .skip((page - 1) * pagesize)
                    .limit(pagesize)
                    .map(e -> Long.valueOf(e))
                    .collect(Collectors.toList());

            // 根据pids查询出所有的movement
            videoList = this.videoApi.getVideoByPids(vids);

        }
        redisTotalPage = PageUtil.totalPage(split.length, pagesize);
    }
    if (videoList.isEmpty()) {
        // 到MongoDB中按照时间顺序分页查找
        videoList = this.videoApi.getVideos(page - redisTotalPage, pagesize);
    }

    // 查询视频作者的详细信息
    List<Long> ids = CollUtil.getFieldValues(videoList, "userId", Long.class);
    Map<Long, UserInfo> map = this.userInfoApi.getUserInfoByIds(ids, null);
    // 封装对象
    List<VideoVo> voList = new ArrayList<>();
    for (Video video : videoList) {
        Long id = video.getUserId();
        UserInfo userInfo = map.get(id);
        if (userInfo != null) {
            voList.add(VideoVo.init(userInfo, video));
        }
    }
    return new PageResult(page, pagesize, 0, voList);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值