Android 表示一对“组元素”的Pair类

一、Pair初认识

打开词典,输入Pair,我们会得到这样的解释

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

其他的,就看我们开发所需了。

本篇完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容