Java对List的操作

 List<Person>转成map,并自定义key

假设有一List中有如下数据

Person{id='100', name='张三0100'}
Person{id='101', name='张三1100'}
Person{id='102', name='张三2100'}
Person{id='103', name='张三3100'}
Person{id='104', name='张三4100'}
Person{id='105', name='张三5100'}
Person{id='106', name='张三6100'}
Person{id='107', name='张三7100'}
Person{id='108', name='张三8100'}
Person{id='109', name='张三9100'}
  1. foreach 依旧简单而直观
     Map<String , Person> map = new HashMap<>();people.forEach(item->{String key=item.getId()+"-"+item.getName();map.put(key,item);});
  2. Stream
     Map<String, Person> stresmMap = people.stream().collect(Collectors.toMap(item -> item.getId() + "-" + item.getName(),item -> item));

打印结果如下: 

   stresmMap.forEach((k, person) ->{System.out.print(k + " : ");System.out.println(person);});
-------------------------------------------------
106-张三6100 : Person{id='106', name='张三6100'}
107-张三7100 : Person{id='107', name='张三7100'}
105-张三5100 : Person{id='105', name='张三5100'}
103-张三3100 : Person{id='103', name='张三3100'}
102-张三2100 : Person{id='102', name='张三2100'}
101-张三1100 : Person{id='101', name='张三1100'}
100-张三0100 : Person{id='100', name='张三0100'}
108-张三8100 : Person{id='108', name='张三8100'}
104-张三4100 : Person{id='104', name='张三4100'}
109-张三9100 : Person{id='109', name='张三9100'}

数据筛选

假设有如下数据,从List<Persion> 中,快速取出每个对象的name,组成一个新的list

let PersonList = [{id:1,name:"张三"},{id:2,name:"李思思"},{id:3,name:"网无无"}
]

 首先你会想到什么?是`foreach`吗 ?

let nameList= []
Person.forEach(item=>{nameList.push(item.name)
})console.log(nameList);
-----------------------------------------
[Running] node "e:\我的文件\testCode\test-java-vue\JavaScript\basic.js"
[ '张三', '李思思', '网无无' ]

有没有更简单的方法呢?

let nameList = PersonList.map(item => item.name);
console.log(nameList);
--------------------------------------------
[Running] node "e:\我的文件\testCode\test-java-vue\JavaScript\basic.js"
[ '张三', '李思思', '网无无' ]

数据筛选Stream()初使用

public List<SeriousManage> filterByExamDate(List<SeriousManage> seriousManageList, int examDateDelta) {LocalDate today = LocalDate.now();return seriousManageList.stream().filter(seriousManage -> {LocalDate examDate = seriousManage.getExamDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();long daysBetween = ChronoUnit.DAYS.between(today, examDate);return daysBetween % examDateDelta == 0;}).collect(Collectors.toList());
}

tips:ChronoUnit.DAYS.between(today, examDate) 是用于计算两个日期之间相差的天数的方法。在这里,today 是表示今天日期的 LocalDate 对象,而 examDate 是表示某条数据的考试日期的 LocalDate 对象。 

在 Java 中,Stream 的 filter 操作用于从一个 Stream 中筛选出满足指定条件的元素,然后返回一个新的 Stream。在处理 List 的时候,您可以使用 stream() 方法将 List 转换为一个 Stream,然后使用 filter 方法对其中的元素进行筛选。

以下是如何在 Java 中使用 Stream 的 filter 操作来处理 List 的简单示例:

List<Person> filteredPeople = people.stream().filter(person -> person.getAge() >= 25).collect(Collectors.toList());

在这个示例中,.filter(person -> person.getAge() >= 25) 部分就是使用 filter 操作来筛选满足条件的 Person 对象。最终,通过 .collect(Collectors.toList()) 将筛选后的结果收集回一个新的 List

将两个List合并为一个

1. addAll 方法

List<T> list1 = new ArrayList<>();
List<T> list2 = new ArrayList<>();// 合并两个列表
list1.addAll(list2);

上述代码会将 list2 中的所有元素添加到 list1 中,从而实现两个列表的合并。

2. Streamconcat 操作

如果您更喜欢使用 Stream API,可以使用 Stream.concat 操作来合并两个流:

List<T> mergedList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());

效率比较 

让我们来比较一下使用 addAll 方法和使用 Streamconcat 操作的效率。

  1. addAll 方法addAll 方法是一个原地操作,它会修改一个列表,并将另一个列表的元素添加到该列表中。这种方法可以很快地将一个列表的元素添加到另一个列表,因为它只涉及一个列表的操作。
    long startTime = System.nanoTime();list1.addAll(list2);long endTime = System.nanoTime();
    long duration = endTime - startTime;System.out.println("addAll time: " + duration + " nanoseconds");
    
  2. Stream 的 concat 操作
    Streamconcat 操作会返回一个新的流,其中包含两个原始流的元素。这涉及创建一个新的流对象以容纳所有元素,并遍历两个原始流的元素来填充新的流。
    long startTime = System.nanoTime();List<T> mergedList = Stream.concat(list1.stream(), list2.stream()).collect(Collectors.toList());long endTime = System.nanoTime();
    long duration = endTime - startTime;System.out.println("Stream.concat time: " + duration + " nanoseconds");
    

    在合并大型列表时,addAll 方法通常会更快,因为它直接修改一个列表而无需创建新的流对象。

返回一个空列表

在有些必要的时候,我们需要返回一个空列表,可以怎么做呢?

List<String> emptyList = new ArrayList<>();// 现在 emptyList 是一个空列表List<String> emptyList = Collections.emptyList();// 现在 emptyList 是一个空列表List<String> emptyList = Arrays.asList();// 现在 emptyList 是一个空列表return Collections.emptyList();

List转String,元素中间用,分割

将一个 List<String> 转换为一个逗号分隔的字符串可以使用 String.join() 方法。这个方法可以将列表中的元素连接起来,使用指定的分隔符。

import java.util.ArrayList;
import java.util.List;public class ListToStringExample {public static void main(String[] args) {List<String> stringList = new ArrayList<>();stringList.add("apple");stringList.add("banana");stringList.add("orange");String result = String.join(",", stringList);System.out.println(result);}
}打印--------------------------------
apple,banana,orange

 如果我们面对的不是String,而是`Long` 亦或其他类型的对象,又该当如何?

当然是先把它变成String了

List<Long> childTenantIds = this.tenantApi.getALLTenantIdsForChild(tenantId).getData();
String childTenantIdsString = String.join(",", childTenantIds.stream().map(String::valueOf).collect(Collectors.toList()));

以上只是我个人日常使用到的一些方法,欢迎各位道友补充。

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

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

相关文章

猫12分类:使用多线程爬取图片的Python程序

本文目标 对于猫12目标检测部分的数据集&#xff0c;采用网络爬虫来制作数据集。 在网络爬虫中&#xff0c;经常需要下载大量的图片。为了提高下载效率&#xff0c;可以使用多线程来并发地下载图片。本文将介绍如何使用Python编写一个多线程爬虫程序&#xff0c;用于爬取图片…

小黑子的SSM整合

SSM整合 一、基于restful页面数据交互1.1 后台接口开发1.2 页面访问处理 二、ssm整合2.1 流程分析2.2 整合配置2.3 功能模块开发2.4 接口测试2.5 表现层与前端数据传输协议定义2.5.1 协议实现 2.6 异常处理器2.6.1 RestControllerAdvice2.6.2 ExceptionHandler2.6.3 项目异常处…

.Net6 Api Swagger配置

1、定义个Swagger版本&#xff08;组&#xff09;的枚举 namespace WebApp.Enums {/// <summary>/// api版本枚举/// </summary>public enum ApiVersion{/// <summary>/// v1版本/// </summary>v1 1,/// <summary>/// v2版本/// </summary&…

前端面试考核点【更持续新中】

文章目录 HTMLcssjsVueReactTypeScript移动端&小程序编译/打包/构建npmnodejs微前端网络安全浏览器性能OKR工程化、标准化 HTML Script放在body中间会阻塞吗&#xff1f;defer与async的区别&#xff1f;https://blog.csdn.net/qq_41887214/article/details/124909219 DOM和…

内存学习(4):内存分类与常用概念3(ROM)

1 ROM介绍 ROM即为只读存储器&#xff0c;全拼是Read Only Memory。 1.1 “只读”的由来 ROM叫只读存储器是因为最早的ROM&#xff08;MROM&#xff09;确实是只能读取不能写入&#xff0c;一旦出厂不能再写&#xff0c;需要在出厂之前预设好它的数据&#xff0c;并且它是掉…

十四、Docker的基本操作

目录 &#xff08;一&#xff09;镜像命令 一、拉取Nginx 二、查看镜像 三、导出文件 四、删除镜像 五、加载镜像 &#xff08;二&#xff09;容器命令 一、例子&#xff1a;运行一个nginx容器 1、输入运行命令 2、使用命令查看宿主机ip 3、在外部浏览器访问 4、查看…

【机器学习】037_暂退法

一、实现原理 具有输入噪音的训练&#xff0c;等价于Tikhonov正则化 核心方法&#xff1a;在前向传播的过程中&#xff0c;计算每一内部层的同时注入噪声 从作用上来看&#xff0c;表面上来说是在训练过程中丢弃一些神经元 假设x是某一层神经网络层的输出&#xff0c;是下一…

redhat下使用CentOS yum源,并安装docker

一、安装yum源 1.卸载yum # 查看系统自身安装的yum软件包 rpm -qa | grep yum # 卸载软yum件包 rpm -e 软件包名称 --nodeps #可以使用简称如 rpm -e yum-* --nodeps2. 安装yum [rootbogon ~]# rpm -ivh --nodeps https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Pa…

海康Visionmaster-环境配置:运行出现 Vm.Core.Solu tion 报错的解决方法

&#xff08;1&#xff09;检查加密狗有没有插好&#xff1f; 是否以管理员权限启动程序&#xff1f;首选 32 位是否取消勾选&#xff1f; &#xff08;2&#xff09;查看 VM4.0 的版本信息是否为最新版本&#xff1f;版本信息为 20220415 以上&#xff0c;版本越新问题就会越少…

【机器学习】036_权重衰退

一、范数 定义&#xff1a;向量的范数表示一个向量有多大&#xff08;分量的大小&#xff09; L1范数&#xff1a; 即向量元素绝对值之和&#xff0c;用符号 ‖ v ‖ 1 表示。 公式&#xff1a; L2范数&#xff1a; 即向量的模&#xff0c;向量各元素绝对值的平方之和再…

低代码平台技术分享官 | 漫话iGIX前端设计模式

设计模式是一个程序员进阶高级的必备技巧&#xff0c;也是评判一个工程师工作经验和能力的试金石。设计模式是程序员多年工作经验的凝练和总结&#xff0c;能够更大限度的优化代码以及对已有代码进行合理重构。但如果你还不知道如何使用设计模式提升前端开发质量&#xff0c;那…

MQTT协议详解

前言 MQTT是一个即时通讯协议&#xff0c;它工作在TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。它使用发布/订阅消息模式&#xff0c;提供一对多的消息发布&#xff0c;解除应用程序耦合。MQTT是轻量、简单、…

适合您的智能手机的 7 款优秀手机数据恢复软件分享

如今&#xff0c;我们做什么都用手机&#xff1b;从拍照到录音&#xff0c;甚至作为 MP3 播放器&#xff0c;我们已经对手机变得非常依恋。这导致我们在手机上留下了很多珍贵的回忆。 不幸的是&#xff0c;我们有可能会丢失手机上的部分甚至全部数据。幸运的是&#xff0c;这不…

1. hadoop环境准备

环境准备 准备三台虚拟机&#xff0c;配置最好是 2C 4G 以上 本文准备三台机器的内网ip分别为 172.17.0.10 172.17.0.11 172.17.0.12本机配置/etc/hosts cat >> /etc/hosts<<EOF 172.17.0.10 hadoop01 172.17.0.11 hadoop02 172.17.0.12 hadoop03 EOF本机设置与…

队列的实现和OJ练习

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法&#xff1f; 初始化队列 小提示&#xff1a; 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

C++-特殊类和单例模式

1.请设计一个类&#xff0c;不能被拷贝 拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 //该类不能发生拷贝class NonCopy{public:NonCopy(const NonCopy& Nc) delete;NonCopy&…

MobaXterm如何连接CentOS7的Linux虚拟机?Redis可视化客户端工具如何连接Linux版Redis?

一、打开Lunix虚拟机,进入虚拟机中,在终端中输入ifconfig,得到以下信息&#xff0c;红框中为ip地址 二、打开MobaXterm&#xff0c;点击session 选择SSH&#xff0c;在Remote host中输入linux得到的IP地址&#xff0c;Specify username中可起一个任意的连接名称。 输入密码 四、…

AM@傅里叶级数@周期为2l的一般情形

文章目录 abstract周期为 2 l 2l 2l的Fourier展开推导例 三角函数和(-1)的幂转换关系(-1)的幂与级数的奇偶项级数通项变形例例 abstract 从特殊到一般,从对周期为 2 π 2\pi 2π的函数到周期为 2 l 2l 2l的函数 推导周期为 2 l 2l 2l情况下的公式又可以借助于周期为 2 π 2\pi…

【洛谷 P3743】kotori的设备 题解(二分答案+递归)

kotori的设备 题目背景 kotori 有 n n n 个可同时使用的设备。 题目描述 第 i i i 个设备每秒消耗 a i a_i ai​ 个单位能量。能量的使用是连续的&#xff0c;也就是说能量不是某时刻突然消耗的&#xff0c;而是匀速消耗。也就是说&#xff0c;对于任意实数&#xff0c;…

60 权限提升-MYMSORA等SQL数据库提权

目录 数据库应用提权在权限提升中的意义WEB或本地环境如何探针数据库应用数据库提权权限用户密码收集等方法目前数据库提权对应的技术及方法等 演示案例Mysql数据库提权演示-脚本&MSF1.UDF提权知识点: (基于MYSQL调用命令执行函数&#xff09;读取数据库存储或备份文件 (了…