Java 中简化操作集合的方法
在日常 Java 开发中,我们经常需要操作集合,如
List、Set和Map。虽然 Java 提供了丰富的集合框架供开发者使用,但在实际编写业务逻辑时,如何简化集合操作、提高代码可读性和效率,依然是一个经常遇到的问题。特别是随着 Java 8 引入的StreamAPI,我们有了更多优雅处理集合的方式。
本文将深入探讨 Java 中简化操作集合的方法,涵盖常见场景、优化策略,并通过表格对比 Java 8 之前和 Java 8 之后的集合操作,帮助开发者更直观地理解如何高效使用集合。
一、常见的集合操作场景
我们经常会遇到以下几种集合操作:
- 遍历集合:对集合中的每个元素进行操作。
- 过滤数据:从集合中筛选符合条件的元素。
- 转换集合:将集合中的元素转换为另一种形式。
- 排序:对集合中的元素进行排序。
- 去重:从集合中去除重复元素。
- 统计:计算集合中元素的总数、最大值、最小值等。
- 合并集合:将多个集合合并为一个。
二、传统集合操作(Java 8 之前)
在 Java 8 之前,集合操作大多数依赖于手动遍历或使用 Collections 工具类。这种方式虽然能完成任务,但代码往往比较冗长且可读性不高。
举个简单的例子,假设我们有一个 List<Integer>,需要从中筛选出大于 10 的数字并进行排序,代码可能如下:
List<Integer> numbers = Arrays.asList(5, 12, 3, 19, 8, 10);
List<Integer> result = new ArrayList<>();for (Integer number : numbers) {if (number > 10) {result.add(number);}
}Collections.sort(result);
System.out.println(result); // 输出: [12, 19]
上述代码虽然能完成任务,但步骤繁琐,需要手动控制遍历、筛选和排序。
三、Java 8 引入的简化操作
随着 Java 8 的发布,Stream API 大幅简化了集合操作。它提供了链式调用和声明式的编程方式,使得代码更加简洁易读。
同样的任务,使用 Stream API 可以简化为:
List<Integer> numbers = Arrays.asList(5, 12, 3, 19, 8, 10);List<Integer> result = numbers.stream().filter(n -> n > 10).sorted().collect(Collectors.toList());System.out.println(result); // 输出: [12, 19]
通过 Stream API,我们可以清晰地看到每个步骤的逻辑:先过滤、再排序,最后收集到新的集合中。这种写法不仅简洁,还避免了中间变量的使用,使得代码更为直观。
四、主要简化方法
1. 遍历集合
传统方式:
List<String> list = Arrays.asList("apple", "banana", "orange");for (String item : list) {System.out.println(item);
}
简化方式(Java 8+):
list.forEach(System.out::println);
forEach 是 Stream 提供的终端操作,它接受一个 Consumer 函数接口,可以让代码更加简洁。
2. 过滤数据
传统方式:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = new ArrayList<>();for (Integer num : list) {if (num % 2 == 0) {evenNumbers.add(num);}
}
简化方式(Java 8+):
List<Integer> evenNumbers = list.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
filter 操作可以轻松筛选出符合条件的元素,代码更加简洁直观。
3. 转换集合
传统方式:
List<String> list = Arrays.asList("a", "b", "c");
List<String> upperList = new ArrayList<>();for (String item : list) {upperList.add(item.toUpperCase());
}
简化方式(Java 8+):
List<String> upperList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
map 操作用于将集合中的元素进行转换,可以轻松实现各种映射需求。
4. 排序
传统方式:
List<Integer> list = Arrays.asList(5, 3, 8, 1);
Collections.sort(list);
简化方式(Java 8+):
List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());
sorted 操作提供了更灵活的排序方式,且可以与其他流操作组合使用。
5. 去重
传统方式:
List<Integer> list = Arrays.asList(1, 2, 2, 3, 4, 4);
Set<Integer> uniqueSet = new HashSet<>(list);
简化方式(Java 8+):
List<Integer> uniqueList = list.stream().distinct().collect(Collectors.toList());
distinct 操作可以轻松去重。
五、表格对比
下表对比了 Java 8 之前和 Java 8 之后在操作集合上的简化情况:
| 操作类型 | Java 8 之前 | Java 8+ 使用 Stream 简化 |
|---|---|---|
| 遍历集合 | 使用 for-each 循环 | 使用 forEach() |
| 过滤数据 | 手动筛选,需 if 判断 | 使用 filter() |
| 转换集合 | 手动遍历转换 | 使用 map() |
| 排序集合 | 使用 Collections.sort() | 使用 sorted() |
| 去重操作 | 转换为 Set 实现 | 使用 distinct() |
| 汇总操作 | 手动累加或统计 | 使用 reduce()、count()、max()、min() |
| 合并集合 | 手动遍历添加 | 使用 flatMap() |
从表中可以看出,Java 8 之前的大多数集合操作都需要依赖显式循环和条件判断。而在 Java 8 之后,通过 Stream API 的链式调用方式,我们可以非常自然地处理集合操作,减少了代码的复杂度。
六、综合案例
最后,让我们用一个综合案例来展示如何在 Java 8+ 中简化多种集合操作。
List<String> words = Arrays.asList("apple", "banana", "orange", "apple", "banana");// 将字符串转换为大写、过滤掉长度小于 6 的字符串、去重、排序
List<String> result = words.stream().map(String::toUpperCase).filter(word -> word.length() >= 6).distinct().sorted().collect(Collectors.toList());System.out.println(result); // 输出: [BANANA, ORANGE]
这个例子展示了从转换、过滤、去重、排序到收集的整个链式操作,代码简洁而高效。
七、总结
通过本文的介绍,我们了解了如何在 Java 中简化集合操作,特别是在 Java 8 之后,Stream API 提供了一种更具表现力和简洁性的编程方式。与传统的显式循环和条件判断相比,使用流操作可以让代码更加优雅、易读,并且减少了样板代码的产生。
无论是遍历、过滤、排序,还是去重和合并集合,Stream API 都为我们提供了便捷的方法。如果你还在使用 Java 8 之前的旧方式处理集合,建议尝试使用 Stream,你会发现代码质量和开发效率都会有显著提升。
相关文章:
Java 中简化操作集合的方法
在日常 Java 开发中,我们经常需要操作集合,如 List、Set 和 Map。虽然 Java 提供了丰富的集合框架供开发者使用,但在实际编写业务逻辑时,如何简化集合操作、提高代码可读性和效率,依然是一个经常遇到的问题。特别是随着…...
ArcGIS Pro SDK (十七)宗地结构
ArcGIS Pro SDK (十七)宗地结构 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 宗地结构 1 获取活动记录 string errorMessage = await QueuedTask.Run(() => {...
D. Co-growing Sequence
传送门:Problem - 1547D - Codeforces 题意:给定一个 数组 a , 构造一个数组 b ,使得 ( a[i] ^ b[i] ) & ( a[i 1] ^ b[ i 1] ) a[i] ^ b[i] 思路:(二进制题目) 设 a[i] ^ b[i] t 我们要让…...
docker配置加速器
阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址:https://ywtoq7bz.mirror.aliyuncs.com 到:etc/docker下:vi daemon.json 格式: { "registry-mirrors": ["加速器地址"] } 注࿱…...
JS事件和DOM
1. DOM 1.1 基本概念 DOM,全称 Document Object Model,即文档对象模型。它是 Web 上最常用的 API 之一,是加载在浏览器中的文档模型,可以将文档表示为节点树(或称 DOM 树),其中每个节点代表文…...
CAS 详解
目录 Java 中 CAS 是如何实现的? CAS 算法存在哪些问题? ABA 问题 循环时间长开销大 只能保证一个共享变量的原子操作 Java 中 CAS 是如何实现的? 在 Java 中,实现 CAS(Compare-And-Swap, 比较并交换)操作的一个关键类是Unsafe。 Un…...
AI大模型那么火,教你一键Modelarts玩转开源LlaMA(羊驼)大模型
近日, LlaMA(羊驼) 这个大模型再次冲上热搜! LLaMA(Large Language Model Meta AI),由 Meta AI 发布的一个开放且高效的大型基础语言模型,共有 7B、13B、33B、65B(650 亿)四种版本。…...
Spring AI Alibaba: 支持国产大模型的Spring ai框架
Spring AI :java做ai应用的最好选择 过去,Java在AI应用开发方面缺乏一个高效且易于集成的框架,这限制了开发者快速构建和部署智能应用程序的能力。 Spring AI正是为解决这一问题而生,它提供了一套统一的接口,使得AI功…...
ChatGPT4o、o1 谁才是最佳大模型?
如何选择合适的 ChatGPT 模型?OpenAI 更新细节与 GPTs 的深入解析 随着人工智能的发展,ChatGPT 已成为众多用户的强大助手,广泛应用于写作、编程、学习和商业等多个领域。然而,面对 OpenAI 提供的众多模型(如 GPT-4、…...
[笔记] 关于CreateProcessWithLogonW函数创建进程
函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …...
Ubuntu的Qt编译环境配置
1、找不到C和C编译器 利用run文件安装QT6.8.0和QT5.12.2版本后,打开QtCreator时,找不到编译器。 可在终端中查找gcc和g版本,如果没有就安装。 gcc --version g --version 如果没有就安装: sudo apt-get install gcc sudo apt-…...
12 django管理系统 - 注册与登录 - 登录
为了演示方便,我就直接使用models里的Admin来演示,不再创建用户模型了。 ok,先做基础配置 首先是在base.html中,新增登录和注册的入口 <ul class"nav navbar-nav navbar-right"><li><a href"/ac…...
2020年计算机网络408真题解析
第一题: 解析:OSI参考模型网络协议的三要素 网络协议的三要素:语法 ,语义,同步(时序) 语法:定义收发双方所交换信息的格式 语法:定义收发双方所要完成的操作 网页的加载 …...
速盾:cdn高防服务器防火墙的特性是什么?
CDN高防服务器防火墙是一种专门为互联网应用提供安全防护的网络安全设备。它采用先进的技术和算法,通过对网络流量进行过滤和检测,以防止恶意攻击和非法访问,保障网络服务的可用性和安全性。CDN高防服务器防火墙的特性主要包括以下几个方面&a…...
小程序分包和预加载
一、目的 分包的目的: 提升小程序的首屏加载速度,其原理和PC端网页的路由懒加载非常类似。即当我们第一个打开一个小程序的时候,只加载主包以及一些公共的资源,当调到某个页面的时候,在加载该页面所在的分包…...
【MATLAB 串口调试+虚拟串口测试】
文章目录 前言一、matlab 串口二、测试串口1.从系统中获取串口号2.避免串口打开被占用3. 安装虚拟串口4. 打开串口助手和MATALB 进行测试 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文…...
mac 安装最新版nginx
1. clone最新版本源代码: git clone https://github.com/nginx/nginx.git 2. 下载PCRE 没有PCRE那我们就下,下载地址:https://sourceforge.net/projects/pcre/files/pcre/,笔者下载的pcre-8.45.zip,下载之后解压到ngi…...
极氪汽车困局:营销频繁车、产品力不足
“ 极氪汽车的“车上吃火锅”营销活动虽登上热搜,但因频繁忽视老用户和产品力不足的争议,并未赢得消费者好感,反而加剧负面印象。 ” 科技新知 原创 作者丨颜瞾 编辑丨蕨影 近日,背靠吉利集团的极氪…...
Icecream 与 Python 日志库及性能分析整合指南
简介 Icecream 是一个用于简化 Python 调试过程的库,它允许开发者轻松打印变量名和它们的值。Python 的 logging 库则提供了一个强大的日志记录系统,用于跟踪应用程序的运行情况。而性能分析则是评估代码执行效率的重要手段。本指南将介绍如何将 Icecre…...
请解读下面的程序:pat =re.compile(r‘\d+‘)res = pat.search(‘www.ddd996.com‘)res.group()
请解读下面的程序: pat re.compile(r\d) res pat.search(www.ddd996.com) res.group() 这段程序使用了正则表达式模块re来搜索字符串中的数字。首先,通过re.compile函数创建了一个正则表达式对象pat,该正则表达式是r\d,意味着匹…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
