介绍java中Pair和Map的区别
目录
- 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的区别相关推荐
- pair java_介绍java中Pair
介绍java中Pair 在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair).配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用. 在核心Java库中可以使用配 ...
- JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...
本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...
- Java中的映射Map - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的映射Map - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,这里开始简单介绍下映射Map,相关类如下图所示 正 ...
- [转]详细介绍java中的数据结构
详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...
- java中Runnable和Callable的区别
文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...
- 简单介绍Java中Comparable和Comparator
转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...
- java list for循环遍历_详解Java中list,set,map的遍历与增强for循环
详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...
- java集合for循环_详解Java中list,set,map的遍历与增强for循环
详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...
- java 中long和Long的区别
转载自: https://blog.csdn.net/z1571978029/article/details/79059480 前言 最近在学习java,接触到了long类型,发现网上这方面的资料较乱 ...
- python filter和map的区别_js中filter和map的区别
介绍了这么多关于filter的内容,大家有没有发现filter和map在为数组中的每个元素调用一次 callback 函数,都是js数组的操作方法,那么filter和map有什么区别呢?其实最大的区别 ...
最新文章
- 获取客户端真实IP地址
- Vue中使用vue-croper插件实现图片上传裁剪并传到SpringBoot后台接口
- ahjesus C# 4.0 Parallel 并行运算
- JS正则限制价格输入 0.01~ 99999.99
- JDK 15中的确切绝对整数
- 紧急通知!不要在MySQL中使用UTF-8编码!!!
- Python BeautifulSoup和Requests爬虫爬取中关村手机资料
- 采用文件白名单方式构建主机安全环境
- Delphi基础教程第一季
- 浅谈游戏《武士刀:零》——赛博朋克风格城市中的刀光剑影
- JobScheduler布置后台任务以及实现进程保活?
- 2021-09-20 Process finished with exit code -1073741515 (0xC0000135) QT Clion
- c语言10以内随机数生成器,C语言随机数生成器
- 1484: 青蛙(四)
- 复杂SQL语句练习【III】
- 自动控制的故事——数字控制部分
- 用计算机计算下面各题,四下计算机练习题汇总
- 给一段下雪的代码。。。
- 电脑和打印机怎么连接
- AtCoder Beginner Contest 163 A Circle Pond 圆周率