User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Java   ›   正文
Java

Java—Pair、MutablePair、ImmutablePair(实用数据结构推荐apache)

2020-10-25 22:30:35
3357  0 0
参考目录 隐藏
1) 市面上的实现
2) JDK自带内部类:AbstractMap.SimpleEntry 和AbstractMap.SimpleImmutableEntry
3) Vavr库:这个不做描述。太偏门了
4) Apache Commons:组件提供的Pair(下问列出专门篇幅讲述,推荐使用)
5) Apache Commons提供的Pair、MutablePair、ImmutablePair详解
6) 扩展使用:Triple、MutableTriple、ImmutableTriple 一次性返回三个对象

阅读完需:约 4 分钟

当一个函数返回两个值并且两个值都有重要意义时我们一般会用Map的key和value来表达,但是这样的话就需要两个键值对,用Map映射去做处理时,此时的key相当于value的一个描述或者引用,而具体的信息都保存在value中,我们可以通过key去获取对应的value。但是当key和value都保存具体信息时,我们就需要用到Pair对了。Pair对也是键值对的形式。

配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用。

Pair是一个抽象类,这个类是定义基本API的抽象实现,它指的是左右两个元素,它也实现了Map.Entry接口,也就是key是左元素,value是右元素;

子类实现的是可能是可变的也可能是不可变的,然而对存储的对象类型是没有限制的,如果可变的对象存储在Pair中,那么Pair对象也会变为可变的;

市面上的实现

javafx.util 包中

Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();
JDK自带内部类:AbstractMap.SimpleEntry 和AbstractMap.SimpleImmutableEntry

SimpleEntry定义在抽象类AbstractMap里面,其构造方法与Pair类似:

AbstractMap.SimpleEntry<Integer, String> entry  = new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();

另外AbstractMap 类还包含一个嵌套类,表示不可变配对:SimpleImmutableEntry 类。

AbstractMap.SimpleImmutableEntry<Integer, String> entry = new AbstractMap.SimpleImmutableEntry<>(1, "one");

应用方式与可变的配对一样,除了配置的值不能修改,尝试修改会抛出UnsupportedOperationException异常。

Vavr库:这个不做描述。太偏门了
Apache Commons:组件提供的Pair(下问列出专门篇幅讲述,推荐使用)

Apache Commons提供的Pair、MutablePair、ImmutablePair详解

组件类是在包org.apache.commons.lang3.tuple下
Pair抽象类部分源码申明如下: 不可直接实例化
它虽然提供了静态方法,但实际返回的是不可变的ImmutablePair。

public abstract class Pair<L, R> implements Map.Entry<L, R>, Comparable<Pair<L, R>>, Serializable {

    private static final long serialVersionUID = 4954918890077093841L;
  /**
 * 返回一个不可变的ImmutablePair对象,即:左元素不可变、右元素不可变,Map的值也不可变
   */
    public static <L, R> Pair<L, R> of(final L left, final R right) {
        return new ImmutablePair<>(left, right);
    }
   /**
 * 获取左元素
   */
    public abstract L getLeft();
   /**
 * 获取右元素
   */
    public abstract R getRight();
   /**
 * 从Map中获取key
   */
    @Override
    public final L getKey() {
        return getLeft();
    }
   /**
 * 获取Map中value
   */
    @Override
    public R getValue() {
        return getRight();
    }
}
  • ImmutablePair不可变的左右元素对
  • MutablePair可以改变值得Pair左右元素对
   public static void main(String[] args) throws Exception {
        Pair<Integer, Integer> pair = Pair.of(1, 10); //同ImmutablePair.of(1, 10)
        Integer left = pair.getLeft();
        Integer right = pair.getRight();
        System.out.println(left); //1
        System.out.println(right); //10
        //pair.setValue(30); //报错:java.lang.UnsupportedOperationException


        pair = MutablePair.of(1, 10);
        ((MutablePair<Integer, Integer>) pair).setLeft(100);
        ((MutablePair<Integer, Integer>) pair).setRight(200);
        left = pair.getLeft();
        right = pair.getRight();
        System.out.println(left); //100
        System.out.println(right); //200
        pair.setValue(200); //备注setValue同setRight方法

    }

例子使用起来非常的简单,只是这种数据结构很多时候确认非常好用。
比如返回夫妻两个、返回一对双胞胎等等,一下就搞定了。

扩展使用:Triple、MutableTriple、ImmutableTriple 一次性返回三个对象

使用办法基本同上

   public static void main(String[] args) throws Exception {
        Triple<String, Integer, String> pair = Triple.of("姓名", 10, "邮箱");
        String name = pair.getLeft(); //姓名
        Integer age = pair.getMiddle(); //10
        String mail = pair.getRight(); //邮箱
        System.out.println(name);
        System.out.println(age);
        System.out.println(mail);
    }

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 593807浏览

随机文章
SpringCloud—Hystrix(四)请求缓存
5年前
SpringBoot—Gson的使用
5年前
Kotlin-内置类型—数组(三)
4年前
SpringBoot—fastjson的使用
5年前
JAVA对json操作—Jackson,Gson,fastjson
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 593807 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付