通过stream实现分页、模糊搜索、按列过滤功能
- 背景
- 逻辑展示
- 示例代码
背景
在有一些数据通过数据库查询出来后,需要经过一定的逻辑处理才进行前端展示,这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐,但是通过stream流处理会简单很多
逻辑展示
这是一个写好的模板,感觉也可以根据这个写成一个通用的处理,后面如果再用的就补充一下
代码解释
①:将完成数据处理的list重新构成一个新的list,当然,里面的数据引用是一样的,但是新list可以对其增删改了
②:设置分页的总数,前端经常会用到这个值。
③:模糊搜索,获取前端传入的模糊搜索值
④:这里可以支持两个字段的模糊搜索,使用filter结合||运算得到结果
⑤:按列过滤,这里也是通过filter函数,其中代码处理如下:
按列过滤和模糊搜索类似,但是传入的是一个map<k,v>,k为这个字段名,v为模糊搜索内容。然后遍历这个map。如果能和filter中的对象值匹配到,保留,如果都匹配不到则丢弃。最后返回这个list
因为过滤完成后的大小会变,所以total重新设置
⑥:排序,排序也可以做出按列排序的方式,使用sorted方法,其中的参数需要一个compartor类型,自定义sortBy()方法生成如下:
对其中的字段进行排序,分别有string、数值类以及默认排序,排序方式desc或者asc等,如果要加时间类或者其他类型,需要手动实现comparter接口构造比较方式了。
⑦分页:分页将传入的当前页和每页显示数目通过skip和limit函数实现,较为简单
⑧结果保存及返回
示例代码
public class Person {private String name;private int age;private String city;// 构造函数、getter和setter方法
}
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class PersonStreamExample {public static void main(String[] args) {List<Person> persons = getSampleData(); // 获取示例数据// 分页int pageSize = 10;int pageNumber = 1;List<Person> page = persons.stream().skip((pageNumber - 1) * pageSize).limit(pageSize).collect(Collectors.toList());// 按列过滤String filterColumn = "city";String filterValue = "New York";List<Person> filtered = persons.stream().filter(person -> filterColumn.equals("name") && person.getName().contains(filterValue)).filter(person -> filterColumn.equals("age") && person.getAge() >= Integer.parseInt(filterValue)).filter(person -> filterColumn.equals("city") && person.getCity().equals(filterValue)).collect(Collectors.toList());// 模糊搜索String keyword = "John";List<Person> searchResults = persons.stream().filter(person -> person.getName().contains(keyword) || person.getCity().contains(keyword)).collect(Collectors.toList());// 按列排序String sortColumn = "age";List<Person> sorted = persons.stream().sorted(Comparator.comparingInt(person -> {if (sortColumn.equals("name")) {return person.getName().hashCode();} else if (sortColumn.equals("age")) {return person.getAge();} else if (sortColumn.equals("city")) {return person.getCity().hashCode();} else {return 0;}})).collect(Collectors.toList());}// 获取示例数据private static List<Person> getSampleData() {// 创建和返回示例数据的逻辑}
}
后续有使用,补充提取为通用方法的内容