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

news2024/10/6 14:30:04

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win7开机进入修复界面处理方法

Win7开机进入修复界面处理方法 2023-09-18 呓语煮酒 大家在使用Windows7的时候是否出现过这样一个问题&#xff0c;就是电脑开机后进入修复界面&#xff0c;界面如下&#xff1a; 一般出现这样的问题基本都是电脑主机非正常关机导致的。一般家用主机都是按照正常关机&#xf…

浅谈C++|STL之deque篇

一.deque基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端插入删除操作 deque与vector区别: vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度回比vector快vector访问元素时的速度会比d…

Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器

Web客户端和服务器之间使用HTTP协议通信。 我们按以下方式来部署通信实例&#xff1a;在Kongming20上运行wget客户端程序&#xff08;一个在命令行下使用的网络下载工具&#xff0c;它支持通过HTTP、HTTPS和FTP协议下载文件&#xff09;&#xff0c;在ernest-laptop上运行squi…

udp的简单整理

最近思考udp处理的一些细节&#xff0c;根据公开课&#xff0c;反复思考&#xff0c;终于有所理解&#xff0c;做整理备用。 0&#xff1a;简单汇总 1&#xff1a;udp是基于报文传输的&#xff0c;接收方收取数据时要一次性读完。 2&#xff1a;借助udp进行发包&#xff0c;…

车载软件架构 —— AUTOSAR Vector SIP包(一)

车载软件架构 —— AUTOSAR Vector SIP包(一) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

uniapp项目实践总结(十六)自定义下拉刷新组件

导语&#xff1a;在日常的开发过程中&#xff0c;我们经常遇到下拉刷新的场景&#xff0c;很方便的刷新游览的内容&#xff0c;在此我也实现了一个下拉刷新的自定义组件。 目录 准备工作原理分析组件实现实战演练内置刷新案例展示 准备工作 在components新建一个q-pull文件夹…

机器学习算法基础--Generalized Linear Regression Model

目录 1.数据的处理及查看 2.数据的处理及可视化 3.模型的创建与拟合 4.算法可视化效果图 5.多维度模型可视化 线性回归讲了很多次了&#xff0c;广义线性回归无非就是拟合的多项式曲线的次数的变化&#xff0c;就不再推导公式和算法流程了。 1.数据的处理及查看 import num…

人工智能轨道交通行业周刊-第60期(2023.9.11-9.17)

本期关键词&#xff1a;巡检机器人、重庆最强大脑、数字铁路规划、高铁起步、Baichuan 2大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMet…

​使用拥抱脸的稳定扩散世界 — 使用文本提示创建 AI 生成图像的扩散器库​

一、简介 你可能已经看到人工智能生成的图像有所增加&#xff0c;这是因为潜在扩散模型的兴起。简单来说&#xff0c;稳定扩散是一种深度学习模型&#xff0c;它可以在给定文本提示的情况下生成图像。 图1&#xff1a;稳定扩散概述 从上图可以看出&#xff0c;我们可以传递文本…

一次Python无法安装模块的问题探索与解决之旅

源起 在Windows 10系统中安装 Python 3.11.5版本&#xff08;目前最新版&#xff09;并安装模块 (比如flask)&#xff0c;安装步骤很简单&#xff1a; 到官方下载安装档https://www.python.org/downloads/点击安装文件安装Python到命令行执行 pip install packagename 安装扩…

基于SpringBoot的图书商城系统

基于SpringBootVue的网上书城系统、图书商城、网上书店系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1…

STM32F4X SPI W25Q128

STM32F4X SPI W25Q128 什么是SPISPI的特点SPI通信引脚SPI接线方式SPI速率SPI通信方式SPI时钟相位和时钟极性 STM32F4X SPISTM32F4X SPI配置STM32F4X SPI频率 W25Q128W25Q128存储结构W25Q128读写操作W25Q128常用指令读取ID命令(0x90)写使能命令(0x06)禁止写使能命令(0x04)读取W2…

7.前端·新建子模块与开发(自动生成)

文章目录 学习地址视频笔记自动代码生成模式开发增删改查功能调试功能权限分配 脚本实现权限分配 学习地址 https://www.bilibili.com/video/BV13g411Y7GS/?p15&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 视频笔记 自动代码生成模式开发 …

30分钟吃掉YOLOv8实例分割范例

本范例我们使用 torchkeras来实现对 ultralytics中的YOLOv8实例分割模型进行自定义的训练&#xff0c;从而对气球进行检测和分割。 尽管ultralytics提供了非常便捷且一致的训练API&#xff0c;再使用torchkeras实现自定义训练逻辑似乎有些多此一举。 但ultralytics的源码结构相…

大众冰球运动水平等级评价规范

声明 本文是学习GB-T 42371-2023 大众冰球运动水平等级评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了大众冰球运动水平的等级和评价程序&#xff0c;规定了等级评价的总体要求以及评价要素、评 价要求&#xff0c;描…

408数据结构算法题目

408数据结构算法题目 408数据结构算法题目一、2020-411.1 题目描述1.2 分析1.3 代码1.3.1 暴力美学1.3.2 贪心 408数据结构算法题目 一、2020-41 1.1 题目描述 2020-41 41.(13分&#xff09; 定义三元组&#xff08;a,b,c)(a,b,c均为正数&#xff09;的距离D|a-b||b-c||c-a…

C++学习笔记--项目知识点集合

一、同步IO、异步IO、阻塞IO、非阻塞IO 首先来看看两种I/O的定义&#xff1a;同步I/O和异步I/O 同步&#xff08;阻塞&#xff09;I/O&#xff1a;在一个线程中&#xff0c;CPU执行代码的速度极快&#xff0c;然而&#xff0c;一旦遇到IO操作&#xff0c;如读写文件、发送网络…

【LeetCode-简单题KMP】459. 重复的子字符串

文章目录 题目方法一&#xff1a;移动匹配方法二&#xff1a;KMP算法 题目 方法一&#xff1a;移动匹配 class Solution {//移动匹配public boolean repeatedSubstringPattern(String s) {StringBuffer str new StringBuffer(s);//ababstr.append(s);//拼接一份自己 abababab…

TCP/IP协议栈的心跳、丢包重传、连接超时机制实例详解

大家好&#xff0c;本文结合具体的问题实例&#xff0c;详细讲解一下TCP/IP协议栈的心跳机制、丢包重传机制等内容&#xff0c;给大家提供一个借鉴和参考。 1、问题概述 虽然软件底层模块在网络恢复后能自动重连上服务器&#xff0c;但会议因为网络问题已经退出&#xff0c;需…

代码随想录|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

121. 买卖股票的最佳时机 dp含义 dp[i][0] 表示第i天持有股票所得最多现金 ,dp[i][1] 表示第i天不持有股票所得最多现金 其实一开始现金是0&#xff0c;那么加入第i天买入股票现金就是 -prices[i]&#xff0c; 这是一个负数。 递推公式 第i天持有股票即dp[i][0],可以由两个…