Guava記錄 - 新集合類型BiMap

一、簡介

Guava - BiMap是Guava中新出的集合類型。官網(wǎng)對(duì)其描述如下:

The traditional way to map values back to keys is to maintain two separate maps and keep them both in sync, but this is bug-prone and can get extremely confusing when a value is already present in the map

大致意思是:
映射回的傳統(tǒng)方法是維護(hù)兩個(gè)獨(dú)立的映射并使它們保持同步,但是這很容易出現(xiàn)bug,而且當(dāng)一個(gè)值已經(jīng)出現(xiàn)在映射中時(shí),可能會(huì)非常混亂。For example:

        Map<String, Integer> nameToId = Maps.newHashMap();
        Map<Integer, String> idToName = Maps.newHashMap();

        nameToId.put("Bob", 42);
        idToName.put(42, "Bob");
        // what happens if "Bob" or 42 are already present?
        // weird bugs can arise if we forget to keep these in sync...

BiMap是一個(gè)Map,咱可以通過inverse()方法獲取原Map的k - v相反的Map以此來替代上訴場(chǎng)景...

二、BiMap的創(chuàng)建

Guava針對(duì)BiMap有多種實(shí)現(xiàn).每種實(shí)現(xiàn)針對(duì)k -v以及v - k的實(shí)現(xiàn)不同.
官方給出的列表如下:

Implementations

Key-Value Map Impl Value-Key Map Impl Corresponding BiMap
HashMap HashMap HashBiMap
ImmutableMap ImmutableMap ImmutableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap

實(shí)驗(yàn)代碼:

        //通過HashBiMap創(chuàng)建
        BiMap<String, String> testHashBiMap = HashBiMap.create();
        //通過ImmutableBiMap創(chuàng)建
        Map<String,String> normalMap = Maps.newHashMap();
        BiMap<String, String> testImmutableBiMap= ImmutableBiMap.copyOf(normalMap);
        //通過EnumBiMap創(chuàng)建
        BiMap<TestEnum, TestEnum> testEnumBiMap = EnumBiMap.create(TestEnum.class,TestEnum.class);
        //通過EnumHashBiMap創(chuàng)建
        BiMap<TestEnum, String> testEnumHashBiMap = EnumHashBiMap.create(TestEnum.class);

三、常用方法

1、inverse()方法

inverse()方法可以獲取當(dāng)前BiMap的鍵值方向映射的Map.

實(shí)驗(yàn)代碼:

        //通過HashBiMap創(chuàng)建
        BiMap<String, String> testHashBiMap = HashBiMap.create();

        testHashBiMap.put("KeyA", "ValueA");
        testHashBiMap.put("KeyA", "ValueB");
        testHashBiMap.put("KeyC", "ValueC");
        System.out.println("=================測(cè)試BiMap的no - inverse()方法=============" + testHashBiMap);
        System.out.println("=================測(cè)試BiMap的inverse()方法=============" + testHashBiMap.inverse());

實(shí)驗(yàn)結(jié)果:

=================測(cè)試BiMap的no - inverse()方法============={KeyA=ValueB, KeyC=ValueC}
=================測(cè)試BiMap的inverse()方法============={ValueB=KeyA, ValueC=KeyC}
2、put()方法

put()方法對(duì)BiMap添加一個(gè)key - value映射
值得注意的是:如果添加不同的key但是value在之前的key中已經(jīng)存在的話,會(huì)拋出IllegalArgumentException異常.

實(shí)驗(yàn)代碼:

        BiMap<String, String> testHashBiMap = HashBiMap.create();

        testHashBiMap.put("KeyA", "ValueA");
        testHashBiMap.put("KeyA", "ValueB");
        testHashBiMap.put("KeyC", "ValueC");

        testHashBiMap.put("KeyD", "ValueB");

實(shí)驗(yàn)結(jié)果:

Exception in thread "main" java.lang.IllegalArgumentException: value already present: ValueB
    at com.google.common.collect.HashBiMap.put(HashBiMap.java:285)
    at com.google.common.collect.HashBiMap.put(HashBiMap.java:260)
    at com.toxic.anepoch.guava.parsing.collection.newtypes.TestBiMap.main(TestBiMap.java:30)
3、forcePut()方法

forcePut()方法是作為put()方法的補(bǔ)充,之前在put()方法中提到了,value需要保持唯一,但是當(dāng)我們實(shí)際使用中的時(shí)候,如果想在后來增加的key中使用已經(jīng)存在的value就可以forcePut()方法.使用之后它會(huì)將已經(jīng)存在與new value值相同的key給移除掉.

實(shí)驗(yàn)代碼:

        //通過HashBiMap創(chuàng)建
        BiMap<String, String> testHashBiMap = HashBiMap.create();

        testHashBiMap.put("KeyA", "ValueA");
        testHashBiMap.put("KeyB", "ValueB");
        testHashBiMap.put("KeyC", "ValueC");
        System.out.println("=================測(cè)試BiMap的no - inverse()方法=============" + testHashBiMap);

        testHashBiMap.forcePut("KeyD", "ValueB");
        System.out.println("=================測(cè)試BiMap的no - inverse()方法=============" + testHashBiMap);

實(shí)驗(yàn)結(jié)果:

=================測(cè)試BiMap的no - inverse()方法============={KeyA=ValueA, KeyB=ValueB, KeyC=ValueC}
=================測(cè)試BiMap的no - inverse()方法============={KeyA=ValueA, KeyC=ValueC, KeyD=ValueB}

從實(shí)驗(yàn)結(jié)果中可以發(fā)現(xiàn).以前持有ValueB的Key為KeyB,使用了forcePut()方法之后其對(duì)應(yīng)的持有Key變?yōu)榱薑eyD.

Note: BiMap utilities like synchronizedBiMap live in Maps.

......未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容