Android 表示一對“組元素”的Pair類

weixin_34353714發表於2017-04-21

一、Pair初認識

開啟詞典,輸入Pair,我們會得到這樣的解釋

1083096-c30249dd3fe5fa47.png
Paste_Image.png

解釋是:一副, 一條, 一把; 一雙, 一對。
噢噢,成雙成對羅。
什麼,你看到的解釋的是最後一行?罷了罷了,開始吧。

還是先看一下官網怎麼說吧

1083096-ee5306b93a36cf3d.png
Paste_Image.png

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的效果。

其他的,就看我們開發所需了。

本篇完。

相關文章