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;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要对List中的多个字段进行过滤,可以使用Java 8的流(Stream)和Predicate来实现。下面是一个示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 创建List并添加元素 List<Person> personList = new ArrayList<>(); personList.add(new Person("Alice", 25)); personList.add(new Person("Bob", 30)); personList.add(new Person("Charlie", 35)); personList.add(new Person("David", 40)); // 定义过滤条件 String nameKeyword = "a"; int ageLimit = 30; // 使用流和Predicate进行过滤 List<Person> filteredList = personList.stream() .filter(person -> person.getName().contains(nameKeyword)) .filter(person -> person.getAge() < ageLimit) .collect(Collectors.toList()); // 打印过滤结果 for (Person person : filteredList) { System.out.println(person.getName() + " - " + person.getAge()); } } static class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } } ``` 在上面的示例中,我们定义了一个Person类,其中包含了name和age字段。我们创建了一个Person对象的List,并使用流和Predicate对其进行过滤。首先,我们定义了两个过滤条件:nameKeyword和ageLimit。然后,我们使用`filter`方法对List进行过滤,只保留满足条件的元素。最后,我们使用`collect`方法将过滤后的元素收集到一个新的List中,并打印结果。 上述代码中的过滤条件是简单的字符串包含和整数比较,你可以根据实际需求修改过滤条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值