当前位置: 首页 > 科技观察

我打赌你从来没有在Java中使用过这个类!

时间:2023-03-17 12:05:11 科技观察

Java中有这么一个类,平时可能用不到,但是需要的时候还是很方便的。在Java中是javafx.util.Pair。在介绍Pair的使用之前,我们先看看下面的例子。如果你对Python或者GO这两种语言有所了解的话,你应该知道这两种语言具有以下特点,即一个函数可以返回多个值,如下图:Python示例:#!/usr/bin/envpython3#-*-coding:utf-8-*-"""Date:2022-07-0912:14Description:atestmodule"""__author__='ziyou'defmul_result(a,b):key="key"value=a+breturnkey,valueif__name__=='__main__':key,mul=mul_result(3,4)print(key)print(mul)GO示例:packagemainimport"fmt"funcmul_result(a,bint)(keystring,valueint){key="key"value=a+breturnkey,value}funcmain(){key,value:=mul_result(3,4)fmt.Println(密钥)fmt。Println(value)}mul_result函数接收两个输入参数,同时返回两个结果,这两个返回值可以在调用处直接获取。那么在Java语言中是否可以实现这样的效果呢?有的朋友就说,那不是那么容易吗?我可以定义一个实体类,返回任意多个字段,有朋友说我可以用集合,不管是List还是Map,如下:publicstaticvoidmain(String[]args){Map结果=mul_result(3,4);System.out.println(result.get("key"));System.out.println(result.get("值"));}publicstaticMapmul_result(inta,intb){Mapresult=newHashMap<>();结果。放(“钥匙”,“钥匙”);结果。放(“值”,a+b);返回结果;这种做法确实是可以的,我们很多时候都是这样使用的。对于某些类型,我们可以使用某些类型的集合。对于不确定的类型,我们可以使用Object类型。但是,当有时候只需要返回两个固定的key-value时,我们可以使用更优雅的Pair形式进行处理。publicstaticvoidmain(String[]args){Pairpair=testPair(3,4);System.out.println(pair.getKey());System.out.println(pair.getValue());}publicstaticPairtestPair(inta,intb){Pairpair=newPair<>("key",a+b);返回对;}这里使用的Pair是JDK自带的类javafx.util.Pair。Pair对象通过构造函数创建后,不能修改。除了Pair,JDK还有另外两个功能相同的类可以使用,如下:“Java极客”,666);System.out.println(simpleEntry.getKey());系统.out.println(simpleEntry.getValue());simpleEntry.setValue(6666);AbstractMap.SimpleImmutableEntryimmutableEntry=newAbstractMap.SimpleImmutableEntry<>("Java极客技术",666);系统输出。println(immutableEntry.getKey());System.out.println(immutableEntry.getValue());免疫tableEntry.setValue(6666);在抽象类AbstractMap中,有两个子类SimpleEntry和SimpleImmutableEntry,作用是一样的。另外,从名字上我们也可以看出,SimpleImmutableEntry是不支持修改的。如果修改,会报UnsupportedOperationException。以上运行代码效果如下:Pair类的使用场景主要是在需要返回固定对的地方,实际场景可能不会太多,所以大家在日常使用的并不多工作,并且可以更换解决方案也有很多。其实通过JDK的源码我们可以看出Pair的实现也很简单。最底层是一个实体类,包含key和value两个字段,和我们自己写的没什么区别。为什么提供的具体实现不采用该主义?写到这里有小伙伴要问了,想返回一个三元组怎么办?对于Python和GO,我可以直接添加一个返回值,但是在Java中不行。确实JDK本身并没有提供三元组的实现。如果真的需要,我们可以自己用Pair构造一个三元组,但是这个世界上总有好心人为我们做了。Javatuples是一个第三方Java元组库。该库目前最多可实现十个元组。如果想实现常用的三元组或者四元组,可以使用这个组件,但是更多元组的使用场景不多,而且不太灵活,我们还是乖乖的自定义实体吧。有兴趣的朋友可以自己试试这个组件,在pom文件中添加如下依赖:org.javatuplesjavatuples1.2中,每个数字的元组类名如下。不得不说,十元组的数量不小。一般使用实体比较方便:Unit(1个元素)Pair(2个元素)Triplet(3个元素)Quartet(4个元素)Quintet(5个元素)Sextet(6个元素)Septet(7个元素)Octet(8个元素)Ennead(9个元素)Decade(10个元素)