通过stream流实现分页、模糊搜索、按列过滤功能

通过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() {
    
    
        // 创建和返回示例数据的逻辑
    }
}

后续有使用,补充提取为通用方法的内容

猜你喜欢

转载自blog.csdn.net/qq_40454136/article/details/132887563
今日推荐