当前位置:   article > 正文

Java对结果集List<Object>进行模糊查询和Page分页_java用了pagehelper后对数据进行筛选

java用了pagehelper后对数据进行筛选

项目场景:

        公司项目需要对在线用户进行管理,在线用户的ID信息存储于缓存redis,列表信息显示的时候,需要通过ID查询本地数据库获取用户信息,分页和关键字模糊查询。


思路:

        step1:获取redis中所有在线用户ID数据;
        step2:根据ID获取本地数据库的用户信息,得到List<UserDto> list结果集合;
        step3:然后通过List流的anyMatch和关键字的String的contains方法达到关键字模糊查询的效果;

        step4:手动PageHelper分页显示(因为list流筛选操作了结果集List,所以PageHelper.startPage(pageIndex,pageSize)会失效,所以需要手动分页,具体原因可以看LZ另一篇PageHelper失效的帖子介绍:点击这里


开始实操:

提示:帖子标题很明确了,这里LZ只写思路step3、step4

业务类实操显示如下:LZ这里模糊查询了三个字段,账户、用户名和角色,模糊查询的字段越多这里代码越臃肿,这里可以优化封装list.stream().anyMatch()和list.stream().filter().collect()

  1. @Override
  2. public ResponseResult getUserList(Integer pageIndex, Integer pageSize, String search) {
  3. //step1:
  4. /**
  5. * 省略
  6. */
  7. //step2:根据ID获取本地数据库的用户信息
  8. List<UserDto> list = new ArrayList<>();
  9. /**
  10. * 省略获取用户信息
  11. */
  12. //step3:关键字筛选模糊查询
  13. search = Optional.ofNullable(search).orElse("");//校验非空并转换空字符串
  14. if (list.size() > 0) {
  15. String finalSearch = search;
  16. boolean nameFlag = list.stream().anyMatch(userDto -> userDto.getUsername().contains(finalSearch));
  17. if (!nameFlag) {//模糊匹配字段
  18. boolean serialnoFlag = list.stream().anyMatch(userDto -> userDto.getAccount().contains(finalSearch));
  19. if (!serialnoFlag) {
  20. boolean roleFlag = list.stream().anyMatch(userDto -> userDto.getRole().contains(finalSearch));
  21. if (!roleFlag) {
  22. list.clear();
  23. } else {
  24. list = list.stream()
  25. .filter(userDto -> userDto.getRole().contains(finalSearch))
  26. .collect(Collectors.toList());//过滤筛选信息
  27. }
  28. } else {
  29. list = list.stream()
  30. .filter(userDto -> userDto.getAccount().contains(finalSearch))
  31. .collect(Collectors.toList());
  32. }
  33. } else {
  34. list = list.stream()
  35. .filter(userDto -> userDto.getUsername().contains(finalSearch))
  36. .collect(Collectors.toList());
  37. }
  38. //step4:手动分页
  39. int total = list.size(); //计算总记录数
  40. List<UserDto> collect = list.stream()
  41. .skip((pageIndex - 1) * pageSize)
  42. .limit(pageSize)
  43. .collect(Collectors.toList());//pageHelper无效,流操作:skip跳记录和limit限制显示记录数
  44. int pageSum = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;//计算总页数
  45. PageHelper.startPage(pageIndex, pageSize);
  46. PageInfo<UserDto> scorePageInfo = new PageInfo<>(collect);
  47. scorePageInfo.setTotal(total);//总记录数
  48. scorePageInfo.setPages(pageSum);//总页数
  49. return ResponseResult.success(scorePageInfo);
  50. }else {
  51. return ResponseResult.success(new PageInfo<>(list));
  52. }
  53. }

优化代码如下:代码层次分明,业务思路清晰(有兴趣的话可以看LZ对七大设计原则的Java实战理解和图解

  1. @Override
  2. public ResponseResult getUserList(Integer pageIndex, Integer pageSize, String search) {
  3. //step1:
  4. /**
  5. * 省略
  6. */
  7. //step2:根据ID获取本地数据库的用户信息
  8. List<UserDto> list = new ArrayList<>();
  9. /**
  10. * 省略获取用户信息
  11. */
  12. //step3:关键字筛选模糊查询
  13. search = Optional.ofNullable(search).orElse("");//校验非空并转换空字符串
  14. if (list.size() > 0) {
  15. String finalSearch = search;
  16. if (!anyMatchUser(list,finalSearch,3)) {//模糊匹配字段
  17. if (!anyMatchUser(list,finalSearch,2)) {
  18. if (!anyMatchUser(list,finalSearch,1)) {
  19. list.clear();
  20. } else {
  21. list = filterUser(list,finalSearch,1);//过滤筛选信息
  22. }
  23. } else {
  24. list = filterUser(list,finalSearch,2);
  25. }
  26. } else {
  27. list = filterUser(list,finalSearch,3);
  28. }
  29. //step4:手动分页
  30. int total = list.size(); //计算总记录数
  31. List<UserDto> collect = list.stream()
  32. .skip((pageIndex - 1) * pageSize)
  33. .limit(pageSize)
  34. .collect(Collectors.toList());//pageHelper无效,流操作:skip跳记录和limit限制显示记录数
  35. int pageSum = total % pageSize == 0 ? total / pageSize : total / pageSize + 1;//计算总页数
  36. PageHelper.startPage(pageIndex, pageSize);
  37. PageInfo<UserDto> scorePageInfo = new PageInfo<>(collect);
  38. scorePageInfo.setTotal(total);//总记录数
  39. scorePageInfo.setPages(pageSum);//总页数
  40. return ResponseResult.success(scorePageInfo);
  41. }else {
  42. return ResponseResult.success(new PageInfo<>(list));
  43. }
  44. }
  1. /**
  2. * list过滤用户
  3. * @param list
  4. * @param finalSearch
  5. * @return
  6. */
  7. private List<UserDto> filterUser(List<UserDto> list,String finalSearch,int filterType){
  8. if(filterType==1){
  9. list = list.stream()
  10. .filter(userDto -> userDto.getRole().contains(finalSearch))
  11. .collect(Collectors.toList());
  12. }else if(filterType==2){
  13. list = list.stream()
  14. .filter(userDto -> userDto.getAccount().contains(finalSearch))
  15. .collect(Collectors.toList());
  16. }else{
  17. list = list.stream()
  18. .filter(userDto -> userDto.getUsername().contains(finalSearch))
  19. .collect(Collectors.toList());
  20. }
  21. return list;
  22. }
  23. /**
  24. * list过滤匹配用户字段
  25. * @param list
  26. * @param finalSearch
  27. * @return
  28. */
  29. private boolean anyMatchUser(List<UserDto> list,String finalSearch,int filterType){
  30. boolean flag = false;
  31. if(filterType==1){
  32. flag = list.stream().anyMatch(userDto -> userDto.getRole().contains(finalSearch));
  33. }else if(filterType==2){
  34. flag = list.stream().anyMatch(userDto -> userDto.getAccount().contains(finalSearch));
  35. }else{
  36. flag = list.stream().anyMatch(userDto -> userDto.getUsername().contains(finalSearch));
  37. }
  38. return flag;
  39. }

结束语:挣钱是游戏,活着才是胜利,快乐才是真谛,健康才是目的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/499094
推荐阅读
相关标签
  

闽ICP备14008679号