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

Java 中简化操作集合的方法

在日常 Java 开发中,我们经常需要操作集合,如 ListSetMap。虽然 Java 提供了丰富的集合框架供开发者使用,但在实际编写业务逻辑时,如何简化集合操作、提高代码可读性和效率,依然是一个经常遇到的问题。特别是随着 Java 8 引入的 Stream API,我们有了更多优雅处理集合的方式。

本文将深入探讨 Java 中简化操作集合的方法,涵盖常见场景、优化策略,并通过表格对比 Java 8 之前和 Java 8 之后的集合操作,帮助开发者更直观地理解如何高效使用集合。

一、常见的集合操作场景

我们经常会遇到以下几种集合操作:

  1. 遍历集合:对集合中的每个元素进行操作。
  2. 过滤数据:从集合中筛选符合条件的元素。
  3. 转换集合:将集合中的元素转换为另一种形式。
  4. 排序:对集合中的元素进行排序。
  5. 去重:从集合中去除重复元素。
  6. 统计:计算集合中元素的总数、最大值、最小值等。
  7. 合并集合:将多个集合合并为一个。
二、传统集合操作(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);

forEachStream 提供的终端操作,它接受一个 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 开发中&#xff0c;我们经常需要操作集合&#xff0c;如 List、Set 和 Map。虽然 Java 提供了丰富的集合框架供开发者使用&#xff0c;但在实际编写业务逻辑时&#xff0c;如何简化集合操作、提高代码可读性和效率&#xff0c;依然是一个经常遇到的问题。特别是随着…...

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

传送门&#xff1a;Problem - 1547D - Codeforces 题意&#xff1a;给定一个 数组 a , 构造一个数组 b &#xff0c;使得 ( a[i] ^ b[i] ) & ( a[i 1] ^ b[ i 1] ) a[i] ^ b[i] 思路&#xff1a;&#xff08;二进制题目&#xff09; 设 a[i] ^ b[i] t 我们要让…...

docker配置加速器

阿里云 控制台》容器镜像服务》镜像工具》镜像加速器 复制地址&#xff1a;https://ywtoq7bz.mirror.aliyuncs.com 到&#xff1a;etc/docker下&#xff1a;vi daemon.json 格式&#xff1a; { "registry-mirrors": ["加速器地址"] } 注&#xff1…...

JS事件和DOM

1. DOM 1.1 基本概念 DOM&#xff0c;全称 Document Object Model&#xff0c;即文档对象模型。它是 Web 上最常用的 API 之一&#xff0c;是加载在浏览器中的文档模型&#xff0c;可以将文档表示为节点树&#xff08;或称 DOM 树&#xff09;&#xff0c;其中每个节点代表文…...

CAS 详解

目录 Java 中 CAS 是如何实现的? CAS 算法存在哪些问题? ABA 问题 循环时间长开销大 只能保证一个共享变量的原子操作 Java 中 CAS 是如何实现的? 在 Java 中&#xff0c;实现 CAS&#xff08;Compare-And-Swap, 比较并交换&#xff09;操作的一个关键类是Unsafe。 Un…...

AI大模型那么火,教你一键Modelarts玩转开源LlaMA(羊驼)大模型

近日&#xff0c; LlaMA(羊驼) 这个大模型再次冲上热搜&#xff01; LLaMA&#xff08;Large Language Model Meta AI&#xff09;&#xff0c;由 Meta AI 发布的一个开放且高效的大型基础语言模型&#xff0c;共有 7B、13B、33B、65B&#xff08;650 亿&#xff09;四种版本。…...

Spring AI Alibaba: 支持国产大模型的Spring ai框架

Spring AI &#xff1a;java做ai应用的最好选择 过去&#xff0c;Java在AI应用开发方面缺乏一个高效且易于集成的框架&#xff0c;这限制了开发者快速构建和部署智能应用程序的能力。 Spring AI正是为解决这一问题而生&#xff0c;它提供了一套统一的接口&#xff0c;使得AI功…...

ChatGPT4o、o1 谁才是最佳大模型?

如何选择合适的 ChatGPT 模型&#xff1f;OpenAI 更新细节与 GPTs 的深入解析 随着人工智能的发展&#xff0c;ChatGPT 已成为众多用户的强大助手&#xff0c;广泛应用于写作、编程、学习和商业等多个领域。然而&#xff0c;面对 OpenAI 提供的众多模型&#xff08;如 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版本后&#xff0c;打开QtCreator时&#xff0c;找不到编译器。 可在终端中查找gcc和g版本&#xff0c;如果没有就安装。 gcc --version g --version 如果没有就安装&#xff1a; sudo apt-get install gcc sudo apt-…...

12 django管理系统 - 注册与登录 - 登录

为了演示方便&#xff0c;我就直接使用models里的Admin来演示&#xff0c;不再创建用户模型了。 ok&#xff0c;先做基础配置 首先是在base.html中&#xff0c;新增登录和注册的入口 <ul class"nav navbar-nav navbar-right"><li><a href"/ac…...

2020年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI参考模型网络协议的三要素 网络协议的三要素&#xff1a;语法 &#xff0c;语义&#xff0c;同步&#xff08;时序&#xff09; 语法&#xff1a;定义收发双方所交换信息的格式 语法&#xff1a;定义收发双方所要完成的操作 网页的加载 …...

速盾:cdn高防服务器防火墙的特性是什么?

CDN高防服务器防火墙是一种专门为互联网应用提供安全防护的网络安全设备。它采用先进的技术和算法&#xff0c;通过对网络流量进行过滤和检测&#xff0c;以防止恶意攻击和非法访问&#xff0c;保障网络服务的可用性和安全性。CDN高防服务器防火墙的特性主要包括以下几个方面&a…...

小程序分包和预加载

一、目的 分包的目的&#xff1a; 提升小程序的首屏加载速度&#xff0c;其原理和PC端网页的路由懒加载非常类似。即当我们第一个打开一个小程序的时候&#xff0c;只加载主包以及一些公共的资源&#xff0c;当调到某个页面的时候&#xff0c;在加载该页面所在的分包&#xf…...

【MATLAB 串口调试+虚拟串口测试】

文章目录 前言一、matlab 串口二、测试串口1.从系统中获取串口号2.避免串口打开被占用3. 安装虚拟串口4. 打开串口助手和MATALB 进行测试 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文…...

mac 安装最新版nginx

1. clone最新版本源代码&#xff1a; git clone https://github.com/nginx/nginx.git 2. 下载PCRE 没有PCRE那我们就下&#xff0c;下载地址&#xff1a;https://sourceforge.net/projects/pcre/files/pcre/&#xff0c;笔者下载的pcre-8.45.zip&#xff0c;下载之后解压到ngi…...

极氪汽车困局:营销频繁车、产品力不足

“ 极氪汽车的“车上吃火锅”营销活动虽登上热搜&#xff0c;但因频繁忽视老用户和产品力不足的争议&#xff0c;并未赢得消费者好感&#xff0c;反而加剧负面印象。 ” 科技新知 原创 作者丨颜瞾 编辑丨蕨影 近日&#xff0c;背靠吉利集团的极氪…...

Icecream 与 Python 日志库及性能分析整合指南

简介 Icecream 是一个用于简化 Python 调试过程的库&#xff0c;它允许开发者轻松打印变量名和它们的值。Python 的 logging 库则提供了一个强大的日志记录系统&#xff0c;用于跟踪应用程序的运行情况。而性能分析则是评估代码执行效率的重要手段。本指南将介绍如何将 Icecre…...

请解读下面的程序:pat =re.compile(r‘\d+‘)res = pat.search(‘www.ddd996.com‘)res.group()

请解读下面的程序&#xff1a; pat re.compile(r\d) res pat.search(www.ddd996.com) res.group() 这段程序使用了正则表达式模块re来搜索字符串中的数字。首先&#xff0c;通过re.compile函数创建了一个正则表达式对象pat&#xff0c;该正则表达式是r\d&#xff0c;意味着匹…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...