新聞中心
在 Java 中有這樣的一個(gè)類,平時(shí)可能都用不到,但是需要的時(shí)候還是會(huì)很方便的,它就是 Java 中的javafx.util.Pair。在介紹 Pair 的使用之前我們先看看下面的例子。

創(chuàng)新互聯(lián)長(zhǎng)期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為??谄髽I(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),??诰W(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
如果對(duì) Python 或者 GO 這兩個(gè)語言有了解的,應(yīng)該知道這兩種語言是有下面這樣的特性,那就是一個(gè)函數(shù)可以返回多個(gè)值,如下所示:
Python 示例:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
"""
日期:2022-07-09 12:14
描述:a test module
"""
__author__ = 'ziyou'
def mul_result(a, b):
key = "key"
value = a + b
return key, value
if __name__ == '__main__':
key, mul = mul_result(3, 4)
print(key)
print(mul)
GO 示例:
package main
import "fmt"
func mul_result(a, b int) (key string, value int) {
key = "key"
value = a + b
return key, value
}
func main() {
key, value := mul_result(3, 4)
fmt.Println(key)
fmt.Println(value)
}
mul_result 函數(shù)接收兩個(gè)入?yún)?,并且同時(shí)也返回兩個(gè)結(jié)果,在調(diào)用的地方可以直接獲取到兩個(gè)返回值。
那么在 Java 語言中能否實(shí)現(xiàn)這樣的效果呢?
有的小伙伴就說了,那不是 so easy 嗎?我可以定義一個(gè)實(shí)體類,想返回多少個(gè)字段就返回多少個(gè)字段,還有的小伙伴就說了,我可以利用集合不管是 List 還是 Map 都可以實(shí)現(xiàn),如下所示:
public static void main(String[] args) {
Map result = mul_result(3, 4);
System.out.println(result.get("key"));
System.out.println(result.get("value"));
}
public static Map mul_result(int a, int b) {
Map result = new HashMap<>();
result.put("key", "key");
result.put("value", a + b);
return result;
} 這種做法確實(shí)可以,而且很多時(shí)候我們就是這么使用的,對(duì)于確定的類型我們可以使用確定類型的集合,對(duì)于不確定類型我們可以用 Object 類型。不過當(dāng)對(duì)于有時(shí)候只有兩個(gè)固定的 key-value 需要返回的時(shí)候,我們就可以用一種更優(yōu)雅的 Pair 形式來進(jìn)行處理。
public static void main(String[] args) {
Pair pair = testPair(3, 4);
System.out.println(pair.getKey());
System.out.println(pair.getValue());
}
public static Pair testPair(int a, int b) {
Pair pair = new Pair<>("key", a + b);
return pair;
} 這里使用的 Pair 是 JDK 自帶的類javafx.util.Pair,Pair 對(duì)象通過構(gòu)造函數(shù)創(chuàng)建過后,是不能進(jìn)行修改的,除了 Pair 之外,JDK 還有另外兩個(gè)一樣功能的類可以使用,如下所示:
public static void main(String[] args) {
AbstractMap.SimpleEntry simpleEntry = new AbstractMap.SimpleEntry<>("Java極客技術(shù)", 666);
System.out.println(simpleEntry.getKey());
System.out.println(simpleEntry.getValue());
simpleEntry.setValue(6666);
AbstractMap.SimpleImmutableEntry immutableEntry = new AbstractMap.SimpleImmutableEntry<>("Java極客技術(shù)", 666);
System.out.println(immutableEntry.getKey());
System.out.println(immutableEntry.getValue());
immutableEntry.setValue(6666);
} 在抽象類 AbstractMap 中有 SimpleEntry 和 SimpleImmutableEntry 這兩個(gè)子類也有同樣的效果,另外從名字上我們也可以看出來 SimpleImmutableEntry 是不支持修改,如果進(jìn)行了修改會(huì)報(bào)錯(cuò) UnsupportedOperationException,上面的代碼運(yùn)行的效果如下:
Pair 類的使用場(chǎng)景主要就是在一些需要返回固定配對(duì)的地方,真正遇到的場(chǎng)景可能也不太多,所以大家在日常的工作中也并不常用,而且可替代的方案也有很多。
其實(shí)通過 JDK 的源碼我們可以看到 Pair 的實(shí)現(xiàn)也特別簡(jiǎn)單,底層也就是包含兩個(gè)字段 key,value 的實(shí)體類,跟我們自己寫的沒太大的區(qū)別,不過既然 JDK 已經(jīng)給我提供的具體的實(shí)現(xiàn)為何不采用拿來主義呢?
寫到這里有的小伙伴就要問了,那我要想返回一個(gè)三元組怎么辦呢?Python 和 GO 我直接加一個(gè)返回值就行了,在 Java 這里不行了吧。確實(shí)JDK 本身并沒有提供三元組的實(shí)現(xiàn),如果真的需要我們可以使用 Pair 自己來構(gòu)造一個(gè)三元組,不過這個(gè)世界上總有一些好事之者已經(jīng)幫我們做好了。
Javatuples 是一個(gè)第三方的 Java 元組庫,這個(gè)庫目前實(shí)現(xiàn)了最多十個(gè)元組,如果要實(shí)現(xiàn)常用的三元組或者四元組可以使用這個(gè)組件,不過更多元組的使用場(chǎng)景并不多,而且也不是很靈活,還是乖乖自定義實(shí)體吧。
感興趣的朋友可以自己試試這個(gè)組件,在 pom 文件中加入如下依賴:
org.javatuples
javatuples
1.2
其中各個(gè)數(shù)量的元組類名稱如下,不得不說十元組的數(shù)量已經(jīng)不算少了,一般這種情況還是使用實(shí)體來的方便:
Unit (1 element)
Pair (2 elements)
Triplet (3 elements)
Quartet (4 elements)
Quintet (5 elements)
Sextet (6 elements)
Septet (7 elements)
Octet (8 elements)
Ennead (9 elements)
Decade (10 elements)
分享文章:我敢打賭你一定沒用過Java中的這個(gè)類!
分享URL:http://m.fisionsoft.com.cn/article/cdcjdip.html


咨詢
建站咨詢
