java8 Predicate和Stream 搜索关键字mysql like多字段后 对结果按优先级排序

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;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值