java8 Predicate和Stream 搜索关键字mysql like多字段后 对结果按优先级排序_Talk is cheap. Show me the code.-CSDN博客

Predicate 判断
Stream.filter() 过滤数据

    //----------------------专家----------------------
    // istatus=1 查询条件 order by create_date desc
    @ApiOperation(value="专家", notes="专家", httpMethod = "GET")
    @GetMapping("/expert")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageIndex",value = "第几页",paramType="query", defaultValue ="1", dataType = "Integer")
            ,@ApiImplicitParam(name = "pageSize",value = "每页几条",paramType="query", defaultValue ="10", dataType = "Integer")
            ,@ApiImplicitParam(name = "hotTopic",value = "是否热门专家(字典is_or_not)",paramType="query", dataType = "String")
            ,@ApiImplicitParam(name = "searchWord",value = "检索词",paramType="query", required = false, dataType = "String")
            ,@ApiImplicitParam(name = "academicTitle",value = "技术职称(字典jishuzhicheng)",paramType="query", required = false, dataType = "String")
            ,@ApiImplicitParam(name = "association",value = "所属协会(字典suoshukexie)",paramType="query", required = false, dataType = "String")
            ,@ApiImplicitParam(name = "society",value = "所属学会(字典suoshuxuehui)",paramType="query", required = false, dataType = "String")
            ,@ApiImplicitParam(name = "classify",value = "分类(字典classify)",paramType="query", required = false, dataType = "String")
    })
    public Result expert(@RequestParam(name = "pageIndex", required = false, defaultValue = "1")Integer pageIndex
            ,@RequestParam(name = "pageSize", required = false, defaultValue = "10")Integer pageSize
            ,@RequestParam(name = "hotTopic", required = false)String hotTopic
            ,@RequestParam(name = "searchWord", required = false)String searchWord
            ,@RequestParam(name = "academicTitle", required = false)String academicTitle
            ,@RequestParam(name = "association", required = false)String association
            ,@RequestParam(name = "society", required = false)String society
            ,@RequestParam(name = "classify", required = false)String classify
    ) {

        Expert expert = new Expert();
        expert.setIstatus("1"); // 启用
        expert.setHotTopic(hotTopic);
        expert.setSearchWord(searchWord);
        expert.setAcademicTitle(academicTitle);
        expert.setAssociation(association);
        expert.setSociety(society);
        expert.setClassify(classify);
        Page<Expert> orderPage = new Page(pageIndex, pageSize, "create_date", false);
        Page<Expert> pageData = expertService.selectPage(orderPage, expert);
        /*真实姓名realName > 从事专业关键词specialityKeywords > 简介summary >
          所学专业speciality >  学习经历learningExperience >
          工作单位workUnit > 职务名称jobTitle >  从业经历workHistory > 成果信息achievement*/
        List<Expert> records = pageData.getRecords();
        if (records.size()>0 && StringUtils.isNotBlank(searchWord)) {
            List<Predicate<Expert>> predicates = new ArrayList();
            predicates.add(r -> r.getRealName() == null ? false : r.getRealName().contains(searchWord));
            predicates.add(r -> r.getSpecialityKeywords() == null ? false : r.getSpecialityKeywords().contains(searchWord));
            predicates.add(r -> r.getSummary() == null ? false : r.getSummary().contains(searchWord));
            predicates.add(r -> r.getSpeciality() == null ? false : r.getSpeciality().contains(searchWord));
            predicates.add(r -> r.getLearningExperience() == null ? false : r.getLearningExperience().contains(searchWord));
            predicates.add(r -> r.getWorkUnit() == null ? false : r.getWorkUnit().contains(searchWord));
            predicates.add(r -> r.getJobTitle() == null ? false : r.getJobTitle().contains(searchWord));
            predicates.add(r -> r.getWorkHistory() == null ? false : r.getWorkHistory().contains(searchWord));
            predicates.add(r -> r.getAchievement() == null ? false : r.getAchievement().contains(searchWord));
            pageData.setRecords(filter(records, predicates));
        }

        return ResultBuilder.success("获取成功",pageData);
    }

    /** 
    * 根据多个判断条件, 对list数据按优先级排序 
    * list 需要过滤的数据
    * predicates 多个判断条件
    */
    private List<Expert> filter(List<Expert> list, List<Predicate<Expert>> predicates) {
        List<Expert> resultList = new ArrayList();
        Stream<Expert> stream = list.stream();
        // 循环判断条件list
        for (int i = 0, psize = predicates.size(), lsize = list.size(); resultList.size() < lsize && i < psize; i++) {
            Predicate<Expert> predicate = predicates.get(i);
            // stream.filter 过滤掉 符合条件的, 同时把符合条件的添加到 待返回的list
            stream = stream.filter(e -> {
                if (predicate.test(e)) {
                    resultList.add(e);
                    return false;
                }
                return true;
            });
        }
        long count = stream.count();
        return resultList;
    }

Original url: Access
Created at: 2020-09-14 18:10:06
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论