当前位置: 首页 > news >正文

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()));

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

相关文章:

Java对List的操作

List<Person>转成map&#xff0c;并自定义key 假设有一List中有如下数据 Person{id100, name张三0100} Person{id101, name张三1100} Person{id102, name张三2100} Person{id103, name张三3100} Person{id104, name张三4100} Person{id105, name张三5100} Person{id106…...

git 将本地已有的一个项目上传到新建的git仓库的方法

将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种 一、 克隆拷贝 第一种方法比较简单&#xff0c;直接用把远程仓库拉到本地&#xff0c;然后再把自己本地的项目拷贝到仓库中去。然后push到远程仓库上去即可。此方法适用于本地项目不是一个git仓库的情况。 具…...

基于Docker的安装和配置Canal

基本介绍 Canal介绍&#xff1a;Canal 是用 Java 开发的基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费的中间件&#xff08;数据库同步需要阿里的 Otter 中间件&#xff0c;基于 Canal&#xff09;。 Canal背景&#xff1a;阿里巴巴 B2B 公司&#xff0c;因为…...

去除IDEA中代码的波浪线(黄色警示线)

去除IDEA中代码的波浪线 首先是点击File—>Settings 操作如下图所示: 然后点击Editor—>Inspections—>General—>Duplicated code fragment(去掉勾选)—>Apply—>OK 即可,详情请看下图所示:...

【Qt之QSplashScreen】开场动画使用:进度条加载及设置鼠标指针不转圈

效果 开场动画效果如下&#xff1a; 开场动画 介绍 QSplashScreen小部件提供了一个启动屏幕&#xff0c;可以在应用程序启动期间显示。 启动屏幕是一个小部件&#xff0c;通常在应用程序启动时显示。启动屏幕通常用于启动时间较长的应用程序(例如需要花费时间建立连接的数据…...

WPF Button点击鼠标左键弹出菜单

目录 ContextMenu介绍WPF实现点击鼠标左键弹出菜单如何禁用右键菜单如何修改菜单样式菜单位置设置 本篇博客介绍WPF点击按钮弹出菜单&#xff0c;效果如下&#xff1a; 菜单的位置、央视可以自定义。 实现技巧&#xff1a;不在xaml里菜单&#xff0c;在按钮左键按下的点击事件里…...

http库requests

http库requests requets简介第一个requestsrequests发送基本的HTTP请求requests处理请求参数requests处理响应requests处理Cookiesrequests处理sessionrequests使用代理requests设置请求头requests处理SSL证书验证requests错误处理和异常处理requests连接池requests请求重试...

package.json 依赖版本中的符号含义

依赖包的版本问题 实例说明~1.2.3主版本次要版本补丁版本;1.2.3 < version < 1.3.0;~1.2主版本次要版本;1.2.0 < version < 1.3.0~1主版本;1.0.0 < version < 2.0.0 符号实例版本范围说明1.0.01.0.0锁定1.0.0版本&#xff0c;必须这个版本。^会匹配最新的大…...

Python try except 用法

关键字解释trytry 就是执行代码的部分&#xff0c;但是对这部分代码没有信心就试一试嘛&#xff0c;这就是tryexcept很不幸&#xff0c;试的时候有错误&#xff0c;没事儿&#xff0c;except 帮你来兜底&#xff0c;它会输出错误&#xff0c;并继续执行下去else程序没有错误&am…...

代码随想录二刷 | 链表 | 翻转链表

代码随想录二刷 &#xff5c; 链表 &#xff5c; 翻转链表 题目描述解题思路 & 代码实现双指针法递归法 206.翻转链表 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4…...

每日一题(LeetCode)----链表--两两交换链表中的节点

每日一题(LeetCode)----链表–两两交换链表中的节点 1.题目&#xff08;[24. 两两交换链表中的节点](https://leetcode.cn/problems/spiral-matrix/)&#xff09; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内…...

竞赛选题 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计 图像识别 深度学习 身份证识别…...

什么时候用@MapperScan 注解?

hello,我是小索奇&#xff0c;给大家讲解一下MapperScan注解的用法。 MapperScan 注解是 MyBatis 框架中的一个注解&#xff0c;它的主要作用是扫描指定包路径下的 Mapper 接口&#xff0c;将其注册为 Spring 的 Bean。这样&#xff0c;在使用 MyBatis 进行数据库操作时&#…...

MQTT.js

MQTT.js mqtt.js简介MQTT测试工具mqttboxMQTTX mqtt使用mqtt引入&#xff08;方式一&#xff09;mqtt引入&#xff08;方式二&#xff09;创建mqtt客户端连接到mqtt代理订阅topic处理接收到的消息重新连接取消订阅发布消息断开连接关闭客户端MQTT APIMQTT在VUE中使用MQTT在Reac…...

html滑动文章标题置顶

position: sticky; 基于用户的滚动位置来定位 首先封装一个组件 例如&#xff1a;AAA组件&#xff08;注意&#xff0c;只能有一层盒子&#xff0c;不能在外面继续包一层div&#xff09; <template><div class"box">{{title}}</div> </templa…...

Android11 桌面默认横屏导致任务键近期任务布局UI显示错误!

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 定义变量&#xff1a;private boolean stch false; keyCode KeyEvent.KEYCODE_APP_SWITCH 取消原来逻辑&#xff0c;采用广播打开近期任务后台 /*/ if (!keyguardOn…...

「Verilog学习笔记」根据状态转移图实现时序电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 这是一个典型的米利型状态机。三段式即可解决。 米利型状态机&#xff1a;即输出不仅和当前状态有关&#xff0c;也和输入有关。 其中ST0&#xff0c;ST1&#xff0c;ST3的…...

使用DHorse发布SpringBoot项目到K8S

前言 在介绍DHorse的操作之前&#xff0c;先来介绍一下使用k8s发布应用的步骤&#xff0c;以SpringBoot应用为例进行说明。 1.首先从代码仓库下载代码&#xff0c;比如GitLab&#xff1b; 2.接着进行构建&#xff0c;比如使用Maven&#xff1b; 3.如果要使用k8s作为编排&am…...

Java修仙记之记录一次与前端女修士论道的经历

文章开始之前&#xff0c;想跟我念一句&#xff1a;福生无量天尊&#xff0c;无量寿佛&#xff0c;阿弥陀佛 第一场论道&#xff1a;id更新之争 一个天气明朗的下午&#xff0c;前端的小美女长发姐告诉我&#xff1a;嘿&#xff0c;小后端&#xff0c;你的代码报错了 我答道&am…...

初识linux(1)

文章目录 什么是linux什么是操作系统&#xff1f;开源 怎么装linux的环境基础指令lspwdcdtouchmkdirrmdir与rmmancpmv 什么是linux linux是一款开源操作系统 什么是操作系统&#xff1f; 操作系统&#xff1a;一种对计算机所有计算机软硬件进行控制和管理的系统软件 开源 开源&…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...