关于Apache-Commons-Lang3中元组的使用

news2024/12/23 4:51:35

关于Apache-Commons-Lang3中元组的使用

在日常工作中,有时候我们并不清楚有这些工具类的存在,造成在开发过程中重新实现导致时间浪费,且开发的代码质量不佳。而 apache 其实已经提供了系列的工具包给我们使用,只是大多数人,平时没有注意到。接下来我们从使用最多的 org.apache.commons.lang3 这个 jar 包开始,了解 apache 为我们提供了怎样的方便体验!

本篇介绍的是关于 Commons-Lang3 中元组的使用


文章目录

      • 关于Apache-Commons-Lang3中元组的使用
        • 1、Commons-Lang3元组介绍
          • 1.1、Commons-Lang3元组的应用场景
          • 1.2、Commons-Lang3 元组的介绍
        • 2、Commons-Lang3元组使用————Pair
          • 2.1、Pair简介
          • 2.2、Pair案例
          • 2.3、Pair子类
        • 3、Commons-Lang3元组使用————Triple
          • 3.1、Triple 简介
          • 3.2、Triple案例
          • 3.3、Triple子类


1、Commons-Lang3元组介绍

1.1、Commons-Lang3元组的应用场景

在实际工作当中,有时候我们会遇到期望返回 1 个以上返回值的情况,在接触元组之前,我们最常用的方式,可能有以下三种:

  1. 定义一个 Class,将返回值作为 Class 的属性,该 Class 作为方法的返回值返回;
  2. 将返回值放入 Object 数组中,数组作为方法的返回值返回;
  3. 将返回值放入 List 或 Map 中,List 或 Map 作为方法的返回值返回

对于使用 Class 的场景,如果返回的两个值并没有任何关联关系,或者说每一个方法返回的参数都不同,那么我们就得为每一个方法的返回类型去创建对应的类来取包装。

使用 map 作为返回值的话调用方在不清楚 map 中具体有什么内容的时候需要去遍历 keySet 或 entrySet,而 list 和 array 也是同样的问题,不知道哪一个参数存放在哪里。

此时我们就需要使用我们本篇的主角————元组。

1.2、Commons-Lang3 元组的介绍

Commons-Lang3 元组指的就是 org.apache.commons.lang3.tuple 包下的 Pair 和 Triple 两个抽象类及其对应子类。

image-20230711221753315


2、Commons-Lang3元组使用————Pair

2.1、Pair简介

Pair 类可以用于存储一对值,类似于一个二元组。Pair 类是一个泛型类,可以存储任意两种类型的值。

以下是 Pair 类的构造方法和方法列表:

		// 构造函数
		public Pair() {}

		// 创建一个具有给定左值和右值的 Pair 对象,默认用的是子类 ImmutablePair,
    public static <L, R> Pair<L, R> of(L left, R right) {
        return new ImmutablePair(left, right);
    }

		// 返回左值
    public abstract L getLeft();
    
    public final L getKey() {
        return this.getLeft();
    }

		// 返回右值
    public abstract R getRight();

    public R getValue() {
        return this.getRight();
    }

    public int compareTo(Pair<L, R> other) {
        return (new CompareToBuilder()).append(this.getLeft(), other.getLeft()).append(this.getRight(), other.getRight()).toComparison();
    }

		// 比较两个 Pair
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        } else if (!(obj instanceof Map.Entry)) {
            return false;
        } else {
            Map.Entry<?, ?> other = (Map.Entry)obj;
            return Objects.equals(this.getKey(), other.getKey()) && Objects.equals(this.getValue(), other.getValue());
        }
    }

		// 返回 Pair 对象的哈希码
    public int hashCode() {
        return (this.getKey() == null ? 0 : this.getKey().hashCode()) ^ (this.getValue() == null ? 0 : this.getValue().hashCode());
    }

		// 返回 Pair 对象的字符串表示
    public String toString() {
        return "(" + this.getLeft() + ',' + this.getRight() + ')';
    }

    public String toString(String format) {
        return String.format(format, this.getLeft(), this.getRight());
    }
2.2、Pair案例
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;

public class Demo {
  
    /**
     *  二元组
     */
    public static Pair<A, B> testPair() {
        A a = new A();
        B b = new B();
        return new ImmutablePair<>(a, b);
    }

    public static void main(String[] args) {
        Pair pair = testPair();
        System.out.println("a : " + pair.getLeft());
        System.out.println("b : " + pair.getRight());
    }
}

2.3、Pair子类

ImmutablePair 和 MutablePair 是 Apache Commons Lang 库中 Pair 的两个实现类,用于表示具有两个值的键值对。

  • ImmutablePair 是一个不可变的类,一旦创建,就不能更改其值,表示一个只读的键值对。它的构造函数接受两个参数,分别是键和值,并且它还提供了一些方法来获取键和值的值。例如,可以使用getLeft() 方法获取键的值,使用 getRight() 方法获取值的值。
  • MutablePair 是一个可变的类,可以在创建之后更改其值,表示一个可变的键值对。其他与 ImmutablePair 类似。

这两个类都实现了 Map.Entry 接口,因此可以将它们作为键值对添加到 Map 中。此外,它们还实现了 Serializable 接口,因此可以将它们序列化为字节数组并在网络上传输或保存到文件中。

应用场景:Pair 类是一个灵活的工具类,适用于许多需要存储一对值的场景。它可以简化代码并提高代码的可读性和可维护性。

3、Commons-Lang3元组使用————Triple

3.1、Triple 简介

Triple 类是一个泛型类,可以存储三个值。类似于Pair类,Triple类也可以用于将多个值封装在一起,以便于传递、比较或存储。

以下是 Triple 类的构造方法和方法列表:

    // 构造函数
		public Triple() {}
		// 构造函数,创建一个具有给定左值、中值和右值的 Triple 对象
    public static <L, M, R> Triple<L, M, R> of(L left, M middle, R right) {
        return new ImmutableTriple(left, middle, right);
    }

		// 返回左值
    public abstract L getLeft();

		// 返回中值
    public abstract M getMiddle();

		// 返回右值
    public abstract R getRight();

    public int compareTo(Triple<L, M, R> other) {
        return (new CompareToBuilder()).append(this.getLeft(), other.getLeft()).append(this.getMiddle(), other.getMiddle()).append(this.getRight(), other.getRight()).toComparison();
    }

		// 判断两个 Triple 对象是否相等
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        } else if (!(obj instanceof Triple)) {
            return false;
        } else {
            Triple<?, ?, ?> other = (Triple)obj;
            return Objects.equals(this.getLeft(), other.getLeft()) && Objects.equals(this.getMiddle(), other.getMiddle()) && Objects.equals(this.getRight(), other.getRight());
        }
    }

		// 返回 Triple 对象的哈希码
    public int hashCode() {
        return (this.getLeft() == null ? 0 : this.getLeft().hashCode()) ^ (this.getMiddle() == null ? 0 : this.getMiddle().hashCode()) ^ (this.getRight() == null ? 0 : this.getRight().hashCode());
    }

		// 返回 Triple 对象的字符串表示
    public String toString() {
        return "(" + this.getLeft() + "," + this.getMiddle() + "," + this.getRight() + ")";
    }

    public String toString(String format) {
        return String.format(format, this.getLeft(), this.getMiddle(), this.getRight());
    }
3.2、Triple案例
import org.apache.commons.lang3.tuple.ImmutableTriple;
import org.apache.commons.lang3.tuple.Triple;

public class Demo {

    /**
     *  三元组
     */
    public static Triple<A, B, C> testTriple() {
        A a = new A();
        B b = new B();
        C c = new C();
        return new ImmutableTriple<>(a, b, c);
    }

    public static void main(String[] args) {
        Triple triple = testTriple();
        System.out.println("a : " + triple.getLeft());
        System.out.println("b : " + triple.getMiddle());
        System.out.println("c : " + triple.getRight());
    }
}
3.3、Triple子类

同 Pair 子类相同,ImmutableTriple 不可变组件对象,MutableTriple 可改变值的三个元素组件对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过列排斥能比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构中有6个1, 行分布是0&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;1&#xff0c;2列分布是2&#xff0c;2&#xff0c;2.统计迭代次…

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图) 目录 回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 回归预测 | MATLAB实现ELM极限学习机多输入单输出回…

由于找不到d3dx9_43.dll,有什么可靠的修复方法?

由于找不到d3dx9_43.dll&#xff0c;无法继续执行代码&#xff0c;这种情况大家是否有遇见过&#xff1f;其实就算没遇到过&#xff0c;大家应该也有遇到别的dll文件丢失吧&#xff1f;道理都一样&#xff0c;都是dll文件丢失&#xff0c;我们只需要把它给修复就可以了&#xf…

第一阶段-第五章 Python的函数

目录 一、函数的介绍  1.学习目标  2. 什么是函数  3.本节的演示  4.为什么要学习、使用函数  5.本小节的总结 二、函数的定义  1.学习目标  2.函数的语法  3.本节的代码演示  4.本小节的总结  5.练习案例&#xff1a;自动查核酸 三、函数的参数  1.学习…

Mac 查看端口和关闭进程

经常使用 node 启动本地&#xff0c;有时一不小心按了 Ctrl Z &#xff08;Command Z&#xff09;把服务关闭了&#xff0c;但实际上没真正关闭该服务&#xff0c;再次启动服务很可能会提示端口号被占用。 系统环境&#xff1a;Mac 查看端口的详细端口占用情况 命令&#xf…

Scrapy爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面&#xff0c;特别是vue与react的普及&#xff0c;使用scrapy框架定位动态网页元素十分困难&#xff0c;而selenium是最流行的浏览器自动化工具&#xff0c;可以模拟浏览器来操作网页&#xff0c;解…

【PCIE】Device Control Register (Offset 08h)

Maximum Payload Size “Maximum Payload Size” &#xff08;最大传输负载大小&#xff09;是PCI Express设备控制寄存器中的一个位域&#xff0c;用于设置设备支持的最大传输负载的大小。 PCI Express使用数据包&#xff08;Packet&#xff09;来传输数据&#xff0c;而数据…

2024考研408-操作系统 第二章-进程与线程 学习笔记

文章目录 前言一、进程1.1、进程的概念、组成与特征1.1.1、进程的概念1.1.2、进程的组成认识PCB认识程序段与数据段&#xff08;包含进程实体概念&#xff09; 1.1.3、进程的特征知识回顾与重要考点 1.2、进程的状态、状态间的转换和组织方式1.2.1、进程的状态进程的五种状态详…

微信扫码跳转小程序实现web登录

前面博客我有写微信扫码跳转h5实现登录&#xff0c;但是需要申请服务号 最近项目迭代&#xff0c;想到小程序能做扫码登录的话&#xff0c;web网页端和小程序同时登录账户不是更好吗&#xff0c;还不用额外申请服务号 第一步 打开微信公众平台&#xff0c;在“开发”菜单下点击…

springcloud笔记二

配置管理服务是共有的&#xff0c;结合微服务自身的配置。这样核心配置更改就无需逐个更改 配置管理: 首先新建一个配置管理 Data ID为配置文件的名称 一般为项目名称-项目环境yaml&#xff0c;如userservice-dev.yaml 编写配置内容&#xff0c;发布 获取nacos配置信息: 可能…

数据透视表:pivot_table()--Pandas

1. 函数功能 创建数据透视表&#xff0c;返回一个EXCEL形式的数据透视表。 2. 函数语法 DataFrame.pivot_table(valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)3. 函数参数 参数…

Vue3 父子组件之间传值

Vue3TSVite环境开发 1.父组件给子组件传递方法&#xff0c;属性和值 父组件引入子组件处里面绑定方法 showBtn &#xff0c;属性name和值msg 子组件通过defineProps()来接收 子组件页面显示父组件的方法 showBtn &#xff0c;属性name和值msg 2.父组件接收子组件传递的…

ModaHub魔搭社区:向量数据库Zilliz Cloud的AUTOINDEX教程

目录 创建索引和向量搜索 总结 为满足用户不同需求,Zilliz Cloud 提供 3 种类型的集群 CU——性能型、容量型和经济型。但是,为不同类型 CU 集群中的 Collection 创建索引时,通常需要根据所选择的 CU 类型调整索引参数。为了方便您创建索引,免去调节参数的麻烦,Zilliz C…

Metasploit Pro 4.22.1-2023070501 (Linux, Windows) - 渗透测试框架

Metasploit Pro 4.22.1-2023070501 (Linux, Windows) - 渗透测试框架 Rapid7 Penetration testing 请访问原文链接&#xff1a;https://sysin.org/blog/metasploit-pro-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 世界…

投影矩阵公式推导

如下图所示&#xff1a; y对x投影记作yx&#xff0c;则&#xff1a; <yx, x> <yx z, x> |yx| * |x| yx |yx| * x / |x| <yx, x> / |x| *x / |x| &#xff0c;即可得到下图中的矩阵。 注意该矩阵的如下性质&#xff1a; p是对称的rank 1p^2 p QE分…

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(3)----修改设备地址

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X----3.修改设备地址 概述修改设备地址主程序测试结果 概述 本章主要介绍如何修改VL6180X传感器的I2C地址&#xff0c;并成功驱动设备以使用新的地址。VL6180X是一种多功能、高性能的接近和环境光传感器&#xff0c;常用于测量物体与…

如何在海外进行A/B测试

A/B测试是对应用的各个版本进行实验&#xff0c;以分析用户如何与其交互的有效过程&#xff0c;它能够帮助我们改进关键指标&#xff0c;例如参与度或应用内购买&#xff0c;以及推出新功能&#xff0c;从而最大限度地降低大规模流失用户的风险。 A/B测试和ASO优化通常适用于应…

唐僧的项目总结报告,我是真服了

早上好&#xff0c;我是老原。 上个月给大家更新了一篇项目管理案例——西天取经。 由于该项目的亏损必须要裁掉团队中的其中一人&#xff0c;究竟该裁掉谁&#xff0c;大家也是讨论的非常激烈&#xff0c;各有各的建议。 鉴于项目已经成功交付&#xff0c;唐僧作为这个项目…

基于51单片机和proteus的智能加湿器设计

此系统是基于51单片机和proteus的仿真设计&#xff0c;功能如下&#xff1a; 1. LCD1602实时显示环境温湿度。 2. 系统分为自动/手动模式&#xff0c;自动模式下系统根据读取的湿度值和设定的湿度值自动运行&#xff0c; 手动模式下使用按键启动/停止设备。 3. 湿度阈值可通…

基于 jmeter 和 shell 的接口性能自动化

目录 前言&#xff1a; 1. 总体需求 2. 实现流程 3.准备工作 4.具体实现 4.1 用例执行 主流程脚本 4.2 服务器监控 监控脚本&#xff1a; 服务器监控脚本 4.3 生成 html 报告 html 样式表 发邮件脚本 前言&#xff1a; 基于JMeter和Shell的接口性能自动化是一种有…