目录

  • Pair和Map共通点
  • Pair和Map不同点
  • 核心java配对实现
    • Pair类
    • AbstractMap.SimpleEntry 和 AbstractMap.SimpleImmutableEntry
    • Apache Commons
    • Vavr库
  • 举个例子

在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用。

在核心Java库中可以使用配对(Pair)的实现。除此之外,某些第三方库,比如Apache Commons和Vavr,已经在各自的api中公开了这个功能。

Pair和Map共通点

Pair和Map都是以key,value进行存储

Pair和Map不同点

  • Pair通过getKey()/getValue()获取对应的key值和value值,没有添加键值对的操作
  • Map是通过get()获取对应的value,通过values()获取所有的value,而且还可以通过put进行新增键值对。
  • pair保存的是一对key value,而map可以保存多对key value。

核心java配对实现

Pair类

Pair类在javafx.util 包中,类构造函数有两个参数,键及对应值:

 Pair<Integer, String> pair = new Pair<>(1, "One");Integer key = pair.getKey();String value = pair.getValue();

示例描述使用Pair类实现简单Integer到String的映射。示例中getKey方法返回key对象,getValue方法返回对应值对象。

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();

其键和值可以通过标准的getter和setter方法获得。

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

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

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

Apache Commons

在Apache Commons库中,org.apache.commons.lang3.tuple 包中提供Pair抽象类,不能被直接实例化,可以通过Pair.of(L,R)实例化,提供了getLeft()和getRight()方法。

 Pair<Integer, String> pair= Pair.of(2, "two");Integer key = pair.getKey();String value = pair.getValue();Integer key = pair.getLeft();String value = pair.getRight();

其有两个子类,分别代表可变与不可变配对:ImmutablePair 和 MutablePair。三者都实现了访问key/value以及setter和getter方法和getLeft()和getRight()方法:

 ImmutablePair<Integer, String> pair = new ImmutablePair<>(2, "Two");Integer key = pair.getKey();String value = pair.getValue();Integer key = pair.getLeft();String value = pair.getRight();

尝试在ImmutablePair 执行setValue方法,会抛出UnsupportedOperationException异常。Pair.of是不可变配对。
但在可变配对上执行完全正常:

 Pair<Integer, String> pair = new MutablePair<>(3, "Three");pair.setValue("New Three");

Vavr库

Vavr库中不可变的Tuple2类提供配对功能:

    Tuple2<Integer, String> pair = new Tuple2<>(4, "Four");Integer key = pair._1();String value = pair._2();

在这个实现中,创建对象后不能修改,所以更新方法返回改变后的新实例:

    tuplePair = pair.update2("New Four");

举个例子

需求:分别用Pair和Map来对value做排序并打印结果。

        // 使用Pair来排序JSONObject jsonObject1 = new JSONObject();jsonObject1.put("a", 9);JSONObject jsonObject2 = new JSONObject();jsonObject2.put("a", 4);JSONObject jsonObject3 = new JSONObject();jsonObject3.put("a", 7);JSONObject jsonObject4 = new JSONObject();jsonObject4.put("a", 8);ArrayList<Pair<Integer, JSONObject>> pairs = new ArrayList<>();pairs.add(Pair.of(1, jsonObject1));pairs.add(Pair.of(2, jsonObject2));pairs.add(Pair.of(3, jsonObject3));pairs.add(Pair.of(4, jsonObject4));List<Pair<Integer, JSONObject>> result = pairs.stream().sorted(Comparator.comparingInt(o -> o.getRight().getInteger("a"))).collect(Collectors.toList());result.forEach(System.out::println);System.out.println("==============================");// 使用map来排序HashMap<Integer, JSONObject> integerJSONObjectHashMap = new HashMap<>();integerJSONObjectHashMap.put(1, jsonObject1);integerJSONObjectHashMap.put(2, jsonObject2);integerJSONObjectHashMap.put(3, jsonObject3);integerJSONObjectHashMap.put(4, jsonObject4);List<Map.Entry<Integer, JSONObject>> result2 = integerJSONObjectHashMap.entrySet().stream().sorted(Comparator.comparingInt(o -> o.getValue().getInteger("a"))).collect(Collectors.toList());result2.forEach(System.out::println);

介绍java中Pair和Map的区别相关推荐

  1. pair java_介绍java中Pair

    介绍java中Pair 在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair).配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用. 在核心Java库中可以使用配 ...

  2. JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...

    本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...

  3. Java中的映射Map - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的映射Map - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,这里开始简单介绍下映射Map,相关类如下图所示 正 ...

  4. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  5. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  6. 简单介绍Java中Comparable和Comparator

    转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...

  7. java list for循环遍历_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  8. java集合for循环_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  9. java 中long和Long的区别

    转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...

  10. python filter和map的区别_js中filter和map的区别

    介绍了这么多关于filter的内容,大家有没有发现filter和map在为数组中的每个元素调用一次 callback 函数,都是js数组的操作方法,那么filter和map有什么区别呢?其实最大的区别 ...

最新文章

  1. 获取客户端真实IP地址
  2. Vue中使用vue-croper插件实现图片上传裁剪并传到SpringBoot后台接口
  3. ahjesus C# 4.0 Parallel 并行运算
  4. JS正则限制价格输入 0.01~ 99999.99
  5. JDK 15中的确切绝对整数
  6. 紧急通知!不要在MySQL中使用UTF-8编码!!!
  7. Python BeautifulSoup和Requests爬虫爬取中关村手机资料
  8. 采用文件白名单方式构建主机安全环境
  9. Delphi基础教程第一季
  10. 浅谈游戏《武士刀:零》——赛博朋克风格城市中的刀光剑影
  11. JobScheduler布置后台任务以及实现进程保活?
  12. 2021-09-20 Process finished with exit code -1073741515 (0xC0000135) QT Clion
  13. c语言10以内随机数生成器,C语言随机数生成器
  14. 1484: 青蛙(四)
  15. 复杂SQL语句练习【III】
  16. 自动控制的故事——数字控制部分
  17. 用计算机计算下面各题,四下计算机练习题汇总
  18. 给一段下雪的代码。。。
  19. 电脑和打印机怎么连接
  20. AtCoder Beginner Contest 163 A Circle Pond 圆周率

热门文章

  1. 光纤跳线结构及分类介绍
  2. android_98_自定义DragLayout
  3. Android 视频直播的流程总览
  4. 视觉组学习内容:Zhang-Suen骨架提取算法
  5. S7-1200使用集成库FB285控制G120变频器的基本步骤
  6. html bottom没有效果,css 设置margin-top或margin-bottom失效不取作用的解决方法
  7. 批量导出qq群的成员列表
  8. QQ列表的收缩展开,带动画效果
  9. 中国运营商IP范围 路由表
  10. Chloe 蔻依 恋旅