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

【JAVA】深入理解Hutool中的Pair、Triple和Tuple:组合数据的新方式,方法返回多个值,嘎嘎香,谁用谁知道,比原生好用更强大

Hutool 是一个开源的 Java 工具库,提供了丰富且实用的功能,旨在减少 Java 程序员在日常开发中重复造轮子的工作。在 Hutool 中,PairTripleTuple 是三种用于组合和存储不同数量相关联数据的类。以下是这三个类的简介:

1、添加依赖

<dependency><groupId>org.dromara.hutool</groupId><artifactId>hutool-all</artifactId><version>6.0.0-M12</version>
</dependency>

2、PairTripleTuple介绍

2.1、 Pair

Pair 用于存储两个元素的键值对,通常包含一个键和一个值。这种结构在需要将两个相关联的数据项作为一个单元进行操作时非常有用。

  • 键值结构:提供键(left)和值(right)两种数据的存储。
  • 不可变性:一旦创建,Pair 中的值不能被修改,保证了数据的不可变性和线程安全。
  • 使用场景:存储用户ID和名称、记录商品价格和库存数量等。

2.2、 Triple

Triple 类似于 Pair并继承于Pair,但它可以存储三个元素。它同样提供了不可变性,确保数据的稳定性。

  • 三个元素:可以看作是Pair 的组合。
  • 不可变性:值不可修改。
  • 使用场景:用于存储更复杂的数据关系,如姓名、年龄和性别,或者订单的ID、价格和状态等。

2.3、 Tuple

Tuple 是一种在 Java 中使用的不可变数据结构,用于存储任意数量的元素。与 PairTriple 不同,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 类在以下场景下特别适用,因为它提供了一个简单的方式来组合和操作两个相关联的数据项,特别是方法需要返回两个值得情况下特别好用,嘎嘎香

  1. 键值对操作:当你需要将两个数据项关联起来,其中一个作为键(key),另一个作为值(value)时,Pair 类非常有用。例如,用户ID和用户姓名、商品ID和价格等。

    Pair<Integer, String> userIdAndName = Pair.of(1, "Alice");
    
  2. 映射关系Pair 类可以用来表示简单的映射关系,如单词和翻译、文件路径和描述等。

    Pair<String, String> wordTranslation = Pair.of("hello", "你好");
    
  3. 元数据存储:当你需要存储与某个实体相关的两个元数据项时,Pair 类可以用来封装这些信息。

    Pair<String, String> metaData = Pair.of("title", "Example Title");
    
  4. 返回结果:在函数或方法返回两个相关结果时,Pair 类提供了一种比基本数据类型数组更具有描述性和类型安全的方式。

    Pair<Integer, Boolean> calculationResult = Pair.of(42, true);
    
  5. 状态封装:在某些情况下,你可能需要将两个状态相关的字段封装在一起,Pair 类可以用来实现这一点。

    Pair<String, String> statusPair = Pair.of("status", "active");
    
  6. 筛选条件:在处理集合或列表时,Pair 类可以用来存储筛选条件,例如在实现自定义的过滤逻辑时。

    Pair<String, String> filterCondition = Pair.of("field", "value");
    
  7. 排序辅助:在需要对列表进行排序,同时需要根据两个条件进行比较时,Pair 类可以用来封装排序的键。

    List<Pair<String, Integer>> sortedList = lists.stream().map(name -> Pair.of(name, calculateScore(name))).sorted(Comparator.comparing(Pair::getRight)).collect(Collectors.toList());
    
  8. 并发编程:由于 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 类在以下场景下比较适用,因为它允许你存储和操作三个相关联的数据项,这些数据项可能共同描述了一个完整的概念或实体:

  1. 复杂实体描述:当你需要表示一个包含三个不同属性或状态的实体时,Triple 非常有用。例如,一个学生的记录可能包含姓名、年龄和成绩。

    Triple<String, Integer, Integer> studentInfo = Triple.of("Alice", 20, 90);
    
  2. 关联数据集:在处理需要三个字段来关联多个数据集时,Triple 类可以帮助你保持数据的一致性和清晰性。例如,你可以使用 Triple 来存储两个日期(开始和结束)以及与这两个日期相关的值。

    Triple<LocalDate, LocalDate, Double> salesData = Triple.of(startDate, endDate, salesAmount);
    
  3. 业务规则参数:在某些业务逻辑中,你可能需要三个参数来定义一个规则或条件。Triple 可以用来封装这些参数。

    Triple<Double, Double, Double> discountRule = Triple.of(minimumAmount, maximumAmount, discountRate);
    
  4. 配置数据:如果你有一个配置文件或数据库表,其中需要三个字段来存储配置信息,Triple 可以用来封装这些配置数据。

    Triple<String, String, Integer> databaseConfig = Triple.of("host", "localhost", 3306);
    
  5. 数据聚合:在需要将三个相关数据项聚合为一个单元时,Triple 类可以简化代码并减少错误。

    Triple<Integer, Integer, Integer> scoreStats = Triple.of(minScore, maxScore, averageScore);
    
  6. 映射和转换:在数据处理和转换过程中,当需要将三个不同的源数据项映射到三个不同的目标数据项时,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);
  1. 函数返回值:当需要一个方法返回多个值,但这些值之间没有明确的键值关系时,可以使用 Tuple

    // 假设 calculateSum 返回三个整数值:总和、最大值和最小值
    Tuple<Integer, Integer, Integer> sumMinMax = calculateSum(1, 2, 3, 4, 5);
    
  2. 参数封装:当你需要将多个参数组合在一起传递给一个方法或构造器时,Tuple 可以用来封装这些参数。

    Tuple<String, Integer, Boolean> userInfo = Tuple.of("Alice", 25, true);
    
  3. 事件或消息:在处理事件驱动或消息传递系统时,Tuple 可以用来封装事件或消息的多个相关属性。

    Tuple<String, String, Integer> messageInfo = Tuple.of("SMS", "Your order has been shipped", 123456);
    
  4. 配置数据:在处理配置文件或系统设置时,Tuple 可以用来存储多个配置项。

    Tuple<String, String, String> appConfig = Tuple.of("host", "http://localhost:8080", "username", "admin");
    
  5. 复合统计:在需要进行复杂的统计计算时,Tuple 可以用来封装多个相关的统计结果。

    Tuple<Integer, Double, Double> stats = Tuple.of(count, average, standardDeviation);
    
  6. 数据导出:在使用数据导出功能时,Tuple 可以用来封装一行或多行数据。

    Tuple<String, String, String, String> exportRow = Tuple.of("id", "name", "email", "status");
    
  7. 自定义对象:当需要创建一个包含多个字段的自定义对象,但这些字段之间没有直接的关联关系时,Tuple 可以用来构建这个对象。

    Tuple<Integer, Double, String> productDetails = Tuple.of(productId, price, description);
    
  8. 通用数据结构:在那些需要灵活存储多个数据项,但不需要特定键值对结构的场景中,Tuple 是一个通用且灵活的选择。

    Tuple<String, Integer, Double, Boolean> complexData = Tuple.of("name", 123, 456.78, false);
    

Tuple 类的优点在于它的灵活性和简单的使用方式,它允许开发者以非常直观的方式组合和传递多个数据项。然而,由于 Tuple 没有提供明确的键名称,因此在使用时可能需要更多的上下文信息或者通过位置索引来访问内部的元素。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于Centos停更yum无法使用的解决方案
  • 可用内存为什么可以超过实际内存
  • C++写一个线程池
  • 阿里云CDN- https(设计支付宝春节开奖业务)
  • Linux——远程连接服务器
  • MySQL下载安装使用教程图文教程(超详细)
  • Gmsh教程
  • 关于dom4j主节点的xmlns无法写入的问题
  • 手机日历如何与Outlook同步
  • 基于PHP+MYSQL开发制作的趣味测试网站源码
  • openlayers请求地图瓦片超时的问题解决
  • SpringBoot 解决 getSession().getAttribute() 在负载均衡环境下无法获取session的问题
  • 【C++PythonJava】字符处理详细解读_字符_ASCLL码_字母数字转换_算法竞赛_开发语言
  • 智能家居和智能家电有什么区别?
  • 深入探讨:Node.js、Vue、SSH服务与SSH免密登录
  • JavaScript 如何正确处理 Unicode 编码问题!
  • codis proxy处理流程
  • Computed property XXX was assigned to but it has no setter
  • Docker下部署自己的LNMP工作环境
  • ES6之路之模块详解
  • JavaScript实现分页效果
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JSONP原理
  • nodejs实现webservice问题总结
  • Promise面试题2实现异步串行执行
  • Service Worker
  • vuex 学习笔记 01
  • Windows Containers 大冒险: 容器网络
  • 闭包--闭包作用之保存(一)
  • 动态规划入门(以爬楼梯为例)
  • - 概述 - 《设计模式(极简c++版)》
  • 基于Android乐音识别(2)
  • 基于游标的分页接口实现
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # include “ “ 和 # include < >两者的区别
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13)DroneCAN 适配器节点(一)
  • (2020)Java后端开发----(面试题和笔试题)
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (AngularJS)Angular 控制器之间通信初探
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (笔试题)合法字符串
  • (汇总)os模块以及shutil模块对文件的操作
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .NET : 在VS2008中计算代码度量值
  • .NET 反射的使用
  • .Net 中Partitioner static与dynamic的性能对比
  • .NetCore部署微服务(二)