【JAVA】深入理解Hutool中的Pair、Triple和Tuple:组合数据的新方式,方法返回多个值,嘎嘎香,谁用谁知道,比原生好用更强大
Hutool 是一个开源的 Java 工具库,提供了丰富且实用的功能,旨在减少 Java 程序员在日常开发中重复造轮子的工作。在 Hutool 中,Pair
、Triple
和 Tuple
是三种用于组合和存储不同数量相关联数据的类。以下是这三个类的简介:
1、添加依赖
<dependency><groupId>org.dromara.hutool</groupId><artifactId>hutool-all</artifactId><version>6.0.0-M12</version>
</dependency>
2、Pair
、Triple
和 Tuple
介绍
2.1、 Pair
Pair
用于存储两个元素的键值对,通常包含一个键和一个值。这种结构在需要将两个相关联的数据项作为一个单元进行操作时非常有用。
- 键值结构:提供键(left)和值(right)两种数据的存储。
- 不可变性:一旦创建,
Pair
中的值不能被修改,保证了数据的不可变性和线程安全。 - 使用场景:存储用户ID和名称、记录商品价格和库存数量等。
2.2、 Triple
Triple
类似于 Pair
并继承于Pair
,但它可以存储三个元素。它同样提供了不可变性,确保数据的稳定性。
- 三个元素:可以看作是
Pair
的组合。 - 不可变性:值不可修改。
- 使用场景:用于存储更复杂的数据关系,如姓名、年龄和性别,或者订单的ID、价格和状态等。
2.3、 Tuple
Tuple
是一种在 Java 中使用的不可变数据结构,用于存储任意数量的元素。与 Pair
和 Triple
不同,Tuple
不强制要求有固定的元素数量,可以存储多个元素,但它不支持修改、添加或删除元素。
- 不可变性:
Tuple
对象创建后,其内部的元素是不可变的,这意味着一旦创建,就不能更改Tuple
中的任何元素。 - 可存储的元素数量:
Tuple
可以存储任意数量的元素,但创建Tuple
时必须指定要存储的元素数量。 - 使用场景:适用于需要存储多个值但不关心键值对结构的情况,例如订单详情、配置参数等。
3、 Pair 的创建和修改
3.1、 创建 Pair
// 用户名修改为 "Alice Smith"
userPair = Pair.of(userPair.getLeft(), "Alice Smith");
int userId = userPair.getLeft();
String userName = userPair.getRight();
3.2、修改 Pair 中的值
// 创建一个新的 Pair,值已被修改
Pair<Integer, String> newPair = Pair.of(pair.getLeft(), "banana");
3.3、 使用场景示例
Pair
类在以下场景下特别适用,因为它提供了一个简单的方式来组合和操作两个相关联的数据项,特别是方法需要返回两个值得情况下特别好用,嘎嘎香
:
-
键值对操作:当你需要将两个数据项关联起来,其中一个作为键(key),另一个作为值(value)时,
Pair
类非常有用。例如,用户ID和用户姓名、商品ID和价格等。Pair<Integer, String> userIdAndName = Pair.of(1, "Alice");
-
映射关系:
Pair
类可以用来表示简单的映射关系,如单词和翻译、文件路径和描述等。Pair<String, String> wordTranslation = Pair.of("hello", "你好");
-
元数据存储:当你需要存储与某个实体相关的两个元数据项时,
Pair
类可以用来封装这些信息。Pair<String, String> metaData = Pair.of("title", "Example Title");
-
返回结果:在函数或方法返回两个相关结果时,
Pair
类提供了一种比基本数据类型数组更具有描述性和类型安全的方式。Pair<Integer, Boolean> calculationResult = Pair.of(42, true);
-
状态封装:在某些情况下,你可能需要将两个状态相关的字段封装在一起,
Pair
类可以用来实现这一点。Pair<String, String> statusPair = Pair.of("status", "active");
-
筛选条件:在处理集合或列表时,
Pair
类可以用来存储筛选条件,例如在实现自定义的过滤逻辑时。Pair<String, String> filterCondition = Pair.of("field", "value");
-
排序辅助:在需要对列表进行排序,同时需要根据两个条件进行比较时,
Pair
类可以用来封装排序的键。List<Pair<String, Integer>> sortedList = lists.stream().map(name -> Pair.of(name, calculateScore(name))).sorted(Comparator.comparing(Pair::getRight)).collect(Collectors.toList());
-
并发编程:由于
Pair
类是不可变的,它可以在并发环境中安全地共享,这在需要实现线程安全的程序时非常有用。
Pair
类的设计简洁且易于使用,它为处理简单的数据关联提供了轻量级和类型安全的解决方案。在任何需要将两个数据项作为一对进行操作的场景中,Pair
类都是一个很好的选择。
4、 Triple 的使用
riple 和 Tuple 的使用与 Pair 类似
- 获取 Triple 中的值
Triple<String, Integer, Boolean> triple = Triple.of("name", 25, true);
String name = triple.getLeft();
int age = triple.getMiddle();
boolean isActive = triple.getRight();
Triple
类在以下场景下比较适用,因为它允许你存储和操作三个相关联的数据项,这些数据项可能共同描述了一个完整的概念或实体:
-
复杂实体描述:当你需要表示一个包含三个不同属性或状态的实体时,
Triple
非常有用。例如,一个学生的记录可能包含姓名、年龄和成绩。Triple<String, Integer, Integer> studentInfo = Triple.of("Alice", 20, 90);
-
关联数据集:在处理需要三个字段来关联多个数据集时,
Triple
类可以帮助你保持数据的一致性和清晰性。例如,你可以使用Triple
来存储两个日期(开始和结束)以及与这两个日期相关的值。Triple<LocalDate, LocalDate, Double> salesData = Triple.of(startDate, endDate, salesAmount);
-
业务规则参数:在某些业务逻辑中,你可能需要三个参数来定义一个规则或条件。
Triple
可以用来封装这些参数。Triple<Double, Double, Double> discountRule = Triple.of(minimumAmount, maximumAmount, discountRate);
-
配置数据:如果你有一个配置文件或数据库表,其中需要三个字段来存储配置信息,
Triple
可以用来封装这些配置数据。Triple<String, String, Integer> databaseConfig = Triple.of("host", "localhost", 3306);
-
数据聚合:在需要将三个相关数据项聚合为一个单元时,
Triple
类可以简化代码并减少错误。Triple<Integer, Integer, Integer> scoreStats = Triple.of(minScore, maxScore, averageScore);
-
映射和转换:在数据处理和转换过程中,当需要将三个不同的源数据项映射到三个不同的目标数据项时,
Triple
类可以帮助你保持数据的一致性。Triple<String, Integer, String> keyToValueMap = Triple.of("key1", 1, "value1");
总之,Triple
类在需要表示或操作三个独立但相关联的数据项时非常有用,它可以提供一种简洁、类型安全的方式来处理这些数据。
5、 Tuple 的使用
Tuple
类在 Java 中用于存储一组任意数量的元素
- 获取 Tuple 中的值
Tuple tuple = Tuple.of(1, "apple", true);
int id = tuple.get(0);
String name = tuple.get(1);
boolean active = tuple.get(2);
-
函数返回值:当需要一个方法返回多个值,但这些值之间没有明确的键值关系时,可以使用
Tuple
。// 假设 calculateSum 返回三个整数值:总和、最大值和最小值 Tuple<Integer, Integer, Integer> sumMinMax = calculateSum(1, 2, 3, 4, 5);
-
参数封装:当你需要将多个参数组合在一起传递给一个方法或构造器时,
Tuple
可以用来封装这些参数。Tuple<String, Integer, Boolean> userInfo = Tuple.of("Alice", 25, true);
-
事件或消息:在处理事件驱动或消息传递系统时,
Tuple
可以用来封装事件或消息的多个相关属性。Tuple<String, String, Integer> messageInfo = Tuple.of("SMS", "Your order has been shipped", 123456);
-
配置数据:在处理配置文件或系统设置时,
Tuple
可以用来存储多个配置项。Tuple<String, String, String> appConfig = Tuple.of("host", "http://localhost:8080", "username", "admin");
-
复合统计:在需要进行复杂的统计计算时,
Tuple
可以用来封装多个相关的统计结果。Tuple<Integer, Double, Double> stats = Tuple.of(count, average, standardDeviation);
-
数据导出:在使用数据导出功能时,
Tuple
可以用来封装一行或多行数据。Tuple<String, String, String, String> exportRow = Tuple.of("id", "name", "email", "status");
-
自定义对象:当需要创建一个包含多个字段的自定义对象,但这些字段之间没有直接的关联关系时,
Tuple
可以用来构建这个对象。Tuple<Integer, Double, String> productDetails = Tuple.of(productId, price, description);
-
通用数据结构:在那些需要灵活存储多个数据项,但不需要特定键值对结构的场景中,
Tuple
是一个通用且灵活的选择。Tuple<String, Integer, Double, Boolean> complexData = Tuple.of("name", 123, 456.78, false);
Tuple
类的优点在于它的灵活性和简单的使用方式,它允许开发者以非常直观的方式组合和传递多个数据项。然而,由于 Tuple
没有提供明确的键名称,因此在使用时可能需要更多的上下文信息或者通过位置索引来访问内部的元素。
相关文章:
【JAVA】深入理解Hutool中的Pair、Triple和Tuple:组合数据的新方式,方法返回多个值,嘎嘎香,谁用谁知道,比原生好用更强大
Hutool 是一个开源的 Java 工具库,提供了丰富且实用的功能,旨在减少 Java 程序员在日常开发中重复造轮子的工作。在 Hutool 中,Pair、Triple 和 Tuple 是三种用于组合和存储不同数量相关联数据的类。以下是这三个类的简介: 1、添…...
modulepreload 对性能的影响
一、正面影响 减少加载时间: modulepreload 可以让浏览器提前下载模块脚本,减少页面加载时间,特别是对于依赖较多的复杂应用。这种预加载可以让浏览器在遇到 modulepreload 链接时立即开始下载,而不是等到实际需要时才下载提升用…...

问题:向上对齐对象的快捷键是: #学习方法#笔记
问题:向上对齐对象的快捷键是: A、T B、L C、R D、W 参考答案如图所示...
C# 4.List
comboBox使用的下拉框 Lsit 列表 1 创建List对象 List<string> list new List<string>(); 2 Add给list 添加元素 list.Add("吃饭"); list.Add("睡觉"); list.Add("打豆豆"); 3 删除一个元素 list.Remove("吃饭"); // 删…...

界面控件DevExpress Blazor UI v24.1 - 发布全新TreeList组件
DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 DevExpress Blazor控件目前已经升级…...

docker默认存储地址 var/lib/docker 满了,换个存储地址操作流程
1. 查看docker 存储地址 docker info如下 var/lib/docker2、查看内存大小 按需执行 df -h 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找这个文件的容量 df -h 查找所有挂载点 du -hs /home/syy_temp/*1、df -h 2、sud…...

SpringMVC的底层工作原理?
1.用户发送请求至前端控制器DispatcherServlet. 2.DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器 3.HandlerMapping找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给DispatcherSe…...

PyTorch 深度学习实践-处理多维特征的输入
视频指路 参考博客笔记 参考笔记二 通过多个线性模型来模拟非线性的空间变换,矩阵计算就是不同维度之间的空间转换 说明:1、乘的权重(w)都一样,加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的,…...
常见逻辑漏洞举例
文章目录 简介用户名可枚举验证码可绕过/验证码回传越权访问任意密码修改验证码回传订单金额任意修改URL跳转漏洞短信轰炸找回密码还有很多逻辑漏洞,其实并没有什么技巧,要分析清楚他的业务逻辑,可能很多正常的流程中就存在着逻辑漏洞。 简介…...

FastAPI 学习之路(五十九)封装统一的json返回处理工具
在本篇文章之前的接口,我们每个接口异常返回的数据格式都不一样,处理起来也没有那么方便,因此我们可以封装一个统一的json。 from fastapi import status from fastapi.responses import JSONResponse, Response from typing import Unionde…...
tg小程序前端-dogs前端源码分析
tg小程序前端-dogs前端源码分析 前端源码 index.html <!DOCTYPE html> <html lang="en"><head><script src="https://telegram.org/js/telegram-web-app.js" onload="window.Telegram.WebApp.expand(); window.Telegram.WebA…...

Linux——多路复用之select
目录 前言 一、select的认识 二、select的接口 三、select的使用 四、select的优缺点 前言 在前面,我们学习了五种IO模型,对IO有了基本的认识,知道了select效率很高,可以等待多个文件描述符,那他是如何等待的呢&a…...
探索.NET内存之海:垃圾回收的艺术与实践
简述 在.NET的广阔天地中,内存管理如同航海中的罗盘,指引着程序的稳健运行和性能的极致优化。作为软件工程师,我们时常在代码的海洋中航行,而内存管理则是确保航程顺畅的关键。本文将带您深入.NET的内存管理世界,一探垃…...

路由数据获取及封装方法
数据库设计 自联表 定义tree字段 public class LabelValue{public int label { get; set; }public string? value { get; set; }public List<LabelValue> children { get; set; }}获取路由方法 public Response<object> getMenuList() {Response<object>…...

Visual Studio Code 实现远程开发
Background 远程开发是指开发人员在本地计算机上进行编码、调试和测试,但实际的开发环境、代码库或应用程序运行在远程服务器上。远程开发的实现方式多种多样,包括通过SSH连接到远程服务器、使用远程桌面软件、或者利用云开发环境等。这里我们是使用VSCo…...
基于STM32设计的人体健康监测系统(华为云IOT)(189)
基于STM32设计的人体健康监测系统(华为云IOT)(189) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架【3】ESP8266模块配置【4】上位机开发思路【5】供电方式1.3 项目开发背景【1】选题的意义【2】可行性分析【…...

开源防病毒工具--ClamAV
产品文档:简介 - ClamAV 文档 开源地址:Cisco-Talos/clamav:ClamAV - 文档在这里:https://docs.clamav.net (github.com) 一、引言 ClamAV(Clam AntiVirus)是一个开源的防病毒工具,广泛应用…...

【网络】Socket编程
文章目录 正确理解端口号理解源IP地址和目的IP地址认识端口号端口号和进程ID 理解Socket网络字节序socket编程接口创建socket套接字bind绑定套接字listen建立监听accept接受连接connect建立连接sendto发送数据接收数据close关闭套接字 sockaddr结构体 正确理解端口号 理解源IP…...

【鸿蒙学习笔记】舜和酒店项目开发
这里写目录标题 前期准备1. 环境准备2. 开发工具准备 创建项目1. 使用 deveco-studio 创建 ShunHeHotel 项目2. 把ShunHeHotel 项目使用git进行版本控制3. 提交第1个commit,Alt0 → 输入commit message → 提交4. 查看已经提交的第一个提交5. gitcode 创建同名远程项…...
再进行程序的写时,不要使用eval函数——内建函数eval的坏处!!!!!!!!
一、安全性问题 执行任意代码: eval函数可以执行任意的Python表达式,包括算术运算、逻辑判断、字符串操作等,甚至可以访问当前作用域中的所有变量和函数。这意味着,如果eval处理的字符串来自不可信的源(如用户输入、外…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...