MybatisPlus-扩展功能-DB静态工具-练习

news/2025/2/25 15:24:12/

思路

总的有两步,第一步:查询用户,第二步:查询地址。

1.先根据id查询用户,得到用户集合。

1.1如果用户集合为空返回一个空集合。

2.查询地址。

2.1.获取用户的id集合。

2.2.根据用户的id集合查询地址,得到一个总的地址集合(也就是根据用户id查出来的所有的地址)。

2.3.转换地址VO。

2.4.用户地址集合分组,相同用户的放入一个集合(组)中,也就是说根据用户的id进行分组,哪几个地址是该id用户的,就放入该id用户对应的集合里面去。得到一个Map集合。key就是用户id,value是该id用户对应的地址。

3.转换VO返回。

    public List<UserVO> queryUserAndAddressByIds(List<Long> ids) {//1.查询用户List<User> users = listByIds(ids);if (CollUtil.isEmpty(users)){return Collections.emptyList();}//2.查询地址//2.1.获取用户id集合List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());//2.2.根据用户id查询地址List<Address> addresses = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();//2.3.转换地址VOList<AddressVO> addressVOList = BeanUtil.copyToList(addresses, AddressVO.class);//2.4.用户地址集合分组,相同用户的放入一个集合(组)中Map<Long, List<AddressVO>> addressMap = new HashMap<>(0);if (CollUtil.isNotEmpty(addressVOList)){addressMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));}//3.转换VO返回List<UserVO> list = new ArrayList<>(users.size());for (User user : users) {//3.1.转化User的PO为VOUserVO vo = BeanUtil.copyProperties(user, UserVO.class);list.add(vo);//3.2.转换地址VOvo.setAddress(addressMap.get(user.getId()));}return list;}

 

 

Stream提供的常用中间方法

<R>Stream<R> map(Function<? super T,extends R> mapper)

对元素进行加工,并返回对应的新流。

Collectors工具类提供了具体的收集方式

public static <T> collector toList()

把元素收集到List集合中。

·ArrayList底层基于数组实现的,根据查询元素快,增删相对慢。

ArrayList第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

1. 扩容触发条件
每次调用 add()方法添加元素时,ArrayList会检查当前元素数量(size)是否等于底层数组长度(elementData.length)。
如果 size + 1 > elementData.length(即当前数组已满),则会触发扩容。

2. 扩容机制
计算新容量:新容量通常是旧容量的 1.5 倍(即 newCapacity = oldCapacity + (oldCapacity >> 1))。例如,初始容量为 10,第一次扩容后变为 10 + 5 = 15。
处理极端情况:如果一次性添加大量元素(如通过 addAll()),新容量会直接调整为刚好能容纳所有元素的最小值,而不是严格按 1.5 倍增长。
数组复制:将旧数组中的元素复制到新数组中,后续操作基于新数组进行。
建议:如果提前知道需要存储大量元素,可通过构造函数 new ArrayList<>(initialCapacity) 指定初始容量,减少扩容次数。

总结
当 ArrayList 的初始容量 10 被填满后,会通过 1.5 倍扩容策略动态调整底层数组大小,确保能够持续添加元素。这是ArrayList实现动态增长的核心机制。


http://www.ppmy.cn/news/1574858.html

相关文章

不同安装路径重复R包清理

df <- as.data.frame(installed.packages()) table(duplicated(df$Package)) ids <- df$Package[duplicated(df$Package)] df2 <- subset(df, df$Package %in% ids)

2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题&#xff08;分类问题&#xff09;什么是分类问题…

Docker 之mysql从头开始——Docker下mysql安装、启动、配置、进入容器执行(查询)sql

一、Docker 之mysql安装配置 步骤一&#xff1a;拉取镜像 1. 查看是否包含已安装的mysql。 docker images | grep mysql 2. 如上图所示&#xff0c;我们有mysql镜像&#xff0c;所以不必对mysql镜像进行拉取&#xff0c;如若没有上图中的惊喜&#xff0c;使用如下命令进行拉取…

【嵌入式Linux应用开发基础】进程间通信(2):消息队列

目录 一、消息队列概述 二、Linux 消息队列相关系统调用 2.1. msgget 2.2. msgsnd 2.3. msgrcv 2.4. msgctl 三、消息队列使用示例 3.1. 发送进程示例代码 3.2. 接收进程示例代码 四、消息队列的优缺点 4.1. 优点 4.2. 缺点 五、关键注意事项 六、常见问题 5.1.…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter22-处理 XML

二十二、处理 XML 处理 XML XML 曾一度是在互联网上存储和传输结构化数据的标准。XML 的发展反映了 Web 的发展&#xff0c;因为DOM 标准不仅是为了在浏览器中使用&#xff0c;而且还为了在桌面和服务器应用程序中处理 XML 数据结构。在没有 DOM 标准的时候&#xff0c;很多开发…

ROS2强化学习全攻略:从基础到实战,打造智能机器人未来

一、引言 随着机器人技术和人工智能的快速发展&#xff0c;ROS2&#xff08;机器人操作系统 2&#xff09;作为新一代机器人开发框架&#xff0c;为机器人应用提供了更强大的功能和更灵活的架构。强化学习作为人工智能领域的重要分支&#xff0c;能够让机器人通过与环境交互自…

力扣3464. 正方形上的点之间的最大距离

力扣3464. 正方形上的点之间的最大距离 题目 题目解析及思路 题目要求在points集合中找出k个点&#xff0c;k个点之间的最小的曼哈顿距离的最大值 最大最小值的题一般直接想到二分 将正方形往右展开成一条线&#xff0c;此时曼哈顿距离为两点直线距离**(仅起点右边的点)** …

趣解http和https各自的原理以及它们的区别

趣解http和https各自的原理以及它们的区别 &#x1f310; HTTP vs HTTPS&#xff1a;一场网络世界的“裸奔”与“加密通话”对决 &#x1f3ad; 角色设定 HTTP&#xff1a;耿直Boy&#xff0c;心无城府&#xff0c;喜欢用大喇叭喊话HTTPS&#xff1a;特工007&#xff0c;随身…