Java 工具类 列表动态维护

news2024/11/29 10:32:34

原本需求:一个二级 list 更新功能。

常规实现:先删除原来的全部数据,再重新插入,这样就很耗时了,所以这里写一个工具类出来。

1. 如果有新增的数据:仅对这些数据新增

2. 如果有删除的数据:仅删除这些数据

3. 其他的话就是更新了。

工具类如下:

import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author SUN
 * @date 2023/10/28
 */
public class DynamicUpdateListUtil {
    
    
    /**
     * 获取需要更新的数据
     * @param allList 原来的全部数据,将目前数据的数据查出来 传过来
     * @param handlerList 当前请求的数据列表,也就是前端接口传来的最新 list
     * @param column 唯一标识列,一般传 id
     * @return 返回需要更新的列表【addList:直接插入数据库;updateList:直接更新;deleteList:直接删除的】
     * @param <T> 操作的 list 里面的对象类型
     */
    public static <T> DynamicUpdateList<T> get(List<T> allList, List<T> handlerList, Function<T, ?> column) {
        DynamicUpdateList<T> objectDynamicUpdateList = new DynamicUpdateList<>();
        
        Set<?> handlerSet = handlerList.stream().map(column).collect(Collectors.toSet());
        Set<?> allSet = allList.stream().map(column).collect(Collectors.toSet());
        
        // 本次要删除的
        List<T> deleteList = allList.stream().filter(all -> !handlerSet.contains(column.apply(all))).toList();
        
        // 本次要添加的
        List<T> addList = handlerList.stream().filter(handler -> !allSet.contains(column.apply(handler))).toList();
        
        // 本次要更新的
        List<T> updateList = handlerList.stream().filter(handler -> allSet.contains(column.apply(handler))).toList();
        
        objectDynamicUpdateList.setAddList(addList);
        objectDynamicUpdateList.setUpdateList(updateList);
        objectDynamicUpdateList.setDeleteList(deleteList);
        
        return objectDynamicUpdateList;
    }
    
    
    public static class DynamicUpdateList<T> {
        
        /**
         * 本次需要新增的数据
         */
        private List<T> addList;
        
        /**
         * 本次需要更新的数据
         */
        private List<T> updateList;
        
        /**
         * 本次需要删除的数据
         */
        private List<T> deleteList;
        
        
        public List<T> getAddList() {
            return addList;
        }
        
        public void setAddList(List<T> addList) {
            this.addList = addList;
        }
        
        public List<T> getUpdateList() {
            return updateList;
        }
        
        public void setUpdateList(List<T> updateList) {
            this.updateList = updateList;
        }
        
        public List<T> getDeleteList() {
            return deleteList;
        }
        
        public void setDeleteList(List<T> deleteList) {
            this.deleteList = deleteList;
        }
        
        @Override
        public String toString() {
            return "DynamicUpdateList: " + "\n addList=" + addList + " \n updateList=" + updateList + " \n deleteList="
                    + deleteList;
        }
    }
    
    
}

用法

具体参数如何传,已经写在了工具类的注释中。

import java.util.List;

public class Main {
    
    public static void main(String[] args) {
        User user1 = new User(1L, "user1");
        User user1_1 = new User(1L, "user2");
        User user2 = new User(2L, "user2");
        User user3 = new User(3L, "user3");
        
        List<User> allList = List.of(user1, user2, user3);
        
        List<User> update = List.of(user1_1, user2);
        
        DynamicUpdateListUtil.DynamicUpdateList<User> dynamicUpdateList = DynamicUpdateListUtil.get(allList, update,
                User::getId);
        
        List<User> addList = dynamicUpdateList.getAddList();
        List<User> updateList = dynamicUpdateList.getUpdateList();
        List<User> deleteList = dynamicUpdateList.getDeleteList();
        
        System.out.println(dynamicUpdateList);
    }
    
}

User.Java 测试用的

/**
 * @author SUN
 * @date 2023/10/28
 */
public class User {
    
    private Long id;
    
    private String name;
    
    
    public User() {
    }
    
    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "User{" + "id=" + id + ", name='" + name + '\'' + '}';
    }
}

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

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

相关文章

【C++】STL容器——探究List与Vector在使用sort函数排序的区别(14)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、Sort函数介绍1.Sort函数接口2.Sort…

Vue3.0插槽

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

[动态规划] (一) LeetCode 1137.第N个泰波那契数

[动态规划] (一) LeetCode 1137.第N个泰波那契数 文章目录 [动态规划] (一) LeetCode 1137.第N个泰波那契数题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结空间优化代码实现 总结 1137. 第 N 个泰波那契数 题目解析 解题思路 状态表示 (1) 题目要…

【菜菜研科研小BUG记录】【Latex写作方面1】不定期更新

Latex写作方面&#xff1a; 项目相关背景&#xff1a; &#xff08;1&#xff09;VscodeTexlive环境&#xff0c;bib文件出现报错 &#xff08;2&#xff09;bib报错出现引文重复现象&#xff0c;这个要通过二分法查找重复的引文位置&#xff0c;比较麻烦&#xff0c;比较难找…

linux常用基本命令大全的使用(三)

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页石马农青衿 &#x1f304;每日一句&#xff1a;努力一点&#xff0c;优秀一点 &#x1f4d1;前言 本文主要是linux常用基本命令面试篇文章&#xff0c;如果有什么…

【vue3】样式穿透、完整新特性、动态css、css-module

一、样式穿透 vue2里面使用 /deep/ vue3里面使用 :deep() :deep(.el-input__inner){background-color: red; }二、完整新特性 :slotted() //parent.vue <template><div><p>这是父级</p><span></span><A><p class"red"…

线扫相机DALSA--常见问题一:软件安装顺序

1.软件安装顺序 先安装&#xff1a;Sapera_LT_SDK&#xff0c;后安装Xtium-CL MX4驱动。 2.初次安装CamExpert&#xff0c;重启电脑后未找到相机 Settings(搜索协议)配置完毕后&#xff0c;需点击Detect Camera(一键查找相机)按钮&#xff0c;搜索相机。第一次查找相机耗时会略…

电脑有自带的录屏功能吗win7

win7有自带的录屏软件&#xff0c;名字叫“问题步骤记录器”&#xff0c;可以实现将每一步操作截成图片&#xff0c;并自动配以相关文字说明的功能。打开记录器的方法&#xff1a;1、按“WinR”键&#xff0c;打开“运行”窗口&#xff1b;2、在“运行”窗口中&#xff0c;输入…

推荐免费的文本转语音工具TTS-Vue【且开源】

标签&#xff1a; 文本转语音&#xff1b; 免费文本转语音软件&#xff1b; 网上有很多文本转语音的工具&#xff0c;但收费具多。 这里推荐一个免费的文本转语音工具。 不需要注册&#xff0c;下载安装就可以使用。且代码开源。 TTS-Vue 软件主页&#xff1a;https://loker…

【uniapp】uview1.x使用upload上传图片

和2.x不同的是&#xff0c;要用 action 来配置后端上传图片的接口地址&#xff1b; 再来一些配置项的命名有所不同&#xff0c;一般1.x的命名用 -&#xff0c;2.x的命名使用小驼峰&#xff1b; 1.x 的上传会自带删除时的提示框&#xff0c;2.x 没有&#xff1b; 重要的几个配置…

python下拉框选择测试

把下拉选择的值得打印出来&#xff1a; import tkinter as tk def on_select(event): # 当选择下拉框中的一项时&#xff0c;此函数将被调用 selected event.widget.cget("text") # 获取选中的文本 print(f"You selected: {selected}") # 打印选中…

Android JNI/NDK 入门从一到二

1. 前言 最基础的创建JNI接口的操作&#xff0c;可以直接看这篇文章 : 第一个Android JNI工程&#xff0c; 本文会基于掌握创建JNI接口的操作的基础之上&#xff0c;来入门JNI/NDK。 2. 在JNI中打印日志 2.1 添加log模块 记得CMake中有log模块&#xff0c;不然编译不过 ta…

Vue 数据绑定 和 数据渲染

目录 一、Vue快速入门 1.简介 : 2.MVVM : 3.准备工作 : 二、数据绑定 1.实例 : 2.验证 : 三、数据渲染 1.单向渲染 : 2.双向渲染 : 一、Vue快速入门 1.简介 : (1) Vue[/vju/]&#xff0c;是Vue.js的简称&#xff0c;是一个前端框架&#xff0c;常用于构建前端用户…

【SEC 学习】美化 Linux 终端

一、步骤 1. 进入 /etc/bash.bashrc vim /etc/bash.bashrc2. 重新加载 bash.bashrc source /etc/bash.bashrc二、各参数指标 符号含义\u当前用户的账号名称\h仅取主机的第一个名字&#xff0c;如上例&#xff0c;则为fc4&#xff0c;.linux则被省略\H完整的主机名称。例如&…

python之计算平面点集的的面积

在当今数据驱动的世界中&#xff0c;计算平面点集的最小外接轮廓面积被广泛应用于各种实际场景中。它是一项重要而魅力十足的任务&#xff0c;旨在找到一个最小的矩形或多边形区域&#xff0c;能够完全包围给定的离散点集。这个看似简单的问题背后隐藏着许多挑战&#xff0c;需…

034-第三代软件开发-自定义Slider(一)

第三代软件开发-自定义Slider(一) 文章目录 第三代软件开发-自定义Slider(一)项目介绍自定义Slider(一)总结一下 关键字&#xff1a; Qt、 Qml、 Slider、 position、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…

基本微信小程序的体检预约小程序

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;体检预约系统小程序被用户普遍使用&#xff0c;为方便用户…

linux-vsftp虚拟多用户

目录 1.安装vsftp 2.安装DB工具&#xff0c;能转化普通文件为vsftpd识别数据库加密文件 3.创建登录虚拟用户的名单 4.加密文件 6.需要修改vsftpd的配置文件 7.修改vsftp的配置文件&#xff0c;加载支持虚拟用户模式 8.针对不同用户开启不同权限 9.重启服务 10.测试 安…

[动态规划] (二) LeetCode 面试题 08.01.三步问题

[动态规划] (二) LeetCode 面试题 08.01.三步问题 文章目录 [动态规划] (二) LeetCode 面试题 08.01.三步问题题意解析解题思路1.状态表示2.状态转移方程3.初始化和填表顺序4.返回值 代码实现总结 面试题 08.01. 三步问题 题意解析 (1) 小孩可以跳1-3阶台阶 (2) 结果很大&…

革新技术,释放创意 :Luminar NeoforMac/win超强AI图像编辑器

Luminar Neo&#xff0c;一个全新的AI图像编辑器&#xff0c;正以其强大的功能和独特的创意引领着图像编辑的潮流。借助于最新的AI技术&#xff0c;Luminar Neo为用户提供了无限可能的图像编辑体验&#xff0c;让每一个想法都能被精彩地实现。 Luminar Neo的AI引擎强大而高效&…