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);
}