通过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() {
// 创建和返回示例数据的逻辑
}
}
后续有使用,补充提取为通用方法的内容