Android 表示一對“組元素”的Pair類
一、Pair初認識
開啟詞典,輸入Pair,我們會得到這樣的解釋
解釋是:一副, 一條, 一把; 一雙, 一對。
噢噢,成雙成對羅。
什麼,你看到的解釋的是最後一行?罷了罷了,開始吧。
還是先看一下官網怎麼說吧
1、API 5 就有了,老兵啊
2、Pair<F,S>,成雙成對羅。
嚴肅的說,就是:
Pair是一個容器,作用是輕便地對兩個物件組成的元素組進行傳遞。這個物件提供了一個合理的equals()方法,如果兩個物件的first和second值相等則返回true。
二、認識API
- 1、Pair(F first, S second),一個Pair容器裡面有2個元素,他們成組存在。
- 2、Pair裡面兩個元素都是final的
- 3、Pair的equals是值比較,不是地址比較
例項化方式
Pair p1 = new Pair(18,"張三"); // 通過 建構函式 例項化物件
Pair p2 = Pair.create(20, "李四");//通過 create方法以泛型的方式 例項化物件
Pair的equals
先看Pair自己的equals原始碼
//android.util下的Pair equals
public boolean equals (Object o){
if (!(o instanceof Pair)) {
return false;
}
Pair<?, ?> p = (Pair<?, ?>) o;
return Objects.equal(p.first, first) && Objects.equal(p.second, second);
}
//這個是android.support.v4.util下的Pair equals
public boolean equals (Object o){
if (!(o instanceof Pair)) {
return false;
}
Pair<?, ?> p = (Pair<?, ?>) o;
return objectsEqual(p.first, first) && objectsEqual(p.second, second);
}
private static boolean objectsEqual (Object a, Object b){
return a == b || (a != null && a.equals(b));
}
無疑值比較。
實踐程式碼
String PAIR = "PAIR";
Pair p1 = new Pair(18, "張三"); // 通過 建構函式 例項化物件
Pair p2 = Pair.create(20, "李四");//通過 create方法 例項化物件
Pair p3 = new Pair(18, "張三"); // 通過 建構函式 例項化物件
boolean e1 = p1.equals(p2);
Log.d(PAIR, "RESULT: " + e1); // false
// Pair的 equals 不是地址比較
boolean e2 = p1.equals(p3);
Log.d(PAIR, "RESULT: " + e2); //true
// Pair的 equals 是值比較,而不是地址比較,當且僅當元素值一致時返回true
boolean e3 = p1.equals("18");
Log.d(PAIR, "RESULT: " + e3); // false
boolean e4 = p1.equals(18);
Log.d(PAIR, "RESULT: " + e4); // false
輸出:
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: false
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: true
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: false
04-21 11:20:39.161 25404-25404/? D/PAIR: RESULT: false
取值
- 通過 物件.first 取出該組的第一個元素值
- 通過 物件.second 取出該組的第一個元素值
String PAIR = "PAIR";
Pair p1 = new Pair(18, "張三"); // 通過 建構函式 例項化物件
Log.d(PAIR, "取 first 資料: " + p1.first + " " + p1.first.getClass()); // 取出
Log.d(PAIR, "取 second 資料: " + p1.second + " " + p1.second.getClass()); // 取出
.
.
輸出:
04-21 11:24:12.583 27027-27027/? D/PAIR: 取 first 資料: 18 class java.lang.Integer
04-21 11:24:12.583 27027-27027/? D/PAIR: 取 second 資料: 張三 class java.lang.String
注意:Pair儲存的“對元素”都是final,一旦複製,值不可改變,所以初始化一次賦值,不可修改。
關於API的部分就說到這裡,因為實在簡單,沒有其他的特殊的了。有興趣可以檢視官方文件。
三、Pair 有什麼用
那問題就來了,Pair有什麼用呢?
特性上面已經說了,Pair就是一組元素,他們是成對存在,你可能會想那不就是鍵值對嗎,key和value嗎?
有點類似,但是他們不一樣,鍵值對的有一個關鍵的key讓我們完成比較和取value等一系列操作。
但是Pair不一樣,它就幾乎只有3個方法,1個equals,一個取first值,一個取second。
道理擺在這裡,具體怎麼用,就看我們自己發揮了。
例子
比如我們知道,List和Map這兩個集合容器是有很大不同的,但是如果在某些情況下,我們想用到List有的但是map沒有的特性,但是我們資料又有一定關聯成對出現或者說需要捆綁,那麼我們是不是利用一下Pair呢?
再具體一點,比如我們現在在做一個IM軟體,就以微信而言吧,會話列表肯定是根據最近聯絡人排序的,然後這是我們想用List實現,那麼是不是可以這樣建立一個List
List<Pair<Long, MyConversation>> sortList = new ArrayList<Pair<Long, MyConversation>>();
像這樣,first我們儲存時間戳,second我們儲存比如名為MyConversation這個實體,那我們是不是就可以在得到資料後利用first進行排序了呢,肯定可以的。
當然了,你要是說我可以在MyConversation新增一個時間戳的欄位的,那這樣沒辦法好好聊天了,我們這裡是為了示例,而且如果用Pair還可以省去實體的一個欄位,避免打破原有結構。
用處
個人認為有以下情況:
- 1、利用Pair和既有資料組成 組元素,不破壞原有結構的同時讓兩個資料產生繫結關係。
- 2、利用Pair和List結合,形成類似Map的效果。
其他的,就看我們開發所需了。
本篇完。
相關文章
- WPF 元素相對另外一個元素的 相對位置
- java容器新增一組元素Java
- Java 正規表示式捕獲組分類Java
- pairAI
- STL::pairAI
- 用三元組連結串列表示的稀疏矩陣類矩陣
- D - Square PairAI
- 一次弄懂CSS的偽類和偽元素CSS
- [Android]中文API(一)android包下的那些類AndroidAPI
- 【正規表示式系列】一些概念(字元組、捕獲組、非捕獲組)字元
- 判斷一個類名或者元素是否存在的思路
- Pair_Work ProjectAIProject
- 對於button元素的理解
- CSS中一些利用偽類、偽元素和相鄰元素選擇器的技巧CSS
- javascript將陣列的元素每兩個一組存入一個新陣列JavaScript陣列
- 元素的相對定位與絕對定位
- Collections工具類,可以使用collections工具類對程式碼中的list進行分組
- 正規表示式教程之匹配一組字元詳解字元
- Lua中pair和ipair的區別AI
- 第 5 章 分組元素
- .NET CORE AUTOMAPPER 對映一個類的子類APP
- 絕對定位元素、浮動元素會生成一個塊級框
- 判斷一個元素是否是另一個元素的子元素或者父元素
- 偽類和偽元素
- 我的工具類分組
- 偽類與偽元素的區別
- C++ 一元謂詞對應的lambda表示式C++
- 匹配雙位元組字元的正規表示式字元
- 匹配雙位元組字串的正規表示式字串
- 正規表示式之字元組字元
- CSS偽元素詳解以及偽元素與偽類的區別CSS
- python如何訪問元組中的元素Python
- 從Preact瞭解一個類React的框架是怎麼實現的(一): 元素建立React框架
- 使用樣式類為某一型別的元素設定樣式型別
- 一次Android動畫工具類的封裝Android動畫封裝
- 刪除元素的指定的class樣式類
- 物件導向 -- 類的組合物件
- Python_類的組合Python