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