Google Guava MultiMaps

番石榴

這是系列文章中的第一篇,我將嘗試解釋和探索Google很棒的Guava java庫 。

我在搜索Apache Commons Collections的通用版本時遇到了番石榴(Guava)–我需要一個Bimap并且厭倦了必須使用強制類型轉換來填充我的代碼–但是我發現要好得多。

它不僅含有更復雜(但有用)集合類型-的各種實現屈德寧 , 多集 , Bimaps -我將詳細討論,但也設施,以支持具有不可變的集合編程的功能更強大的樣式, 功能和謂語對象。 這完全改變了我編寫Java的方式,同時使我對Java有時笨拙的語法越來越沮喪,這是我打算在以后的文章中探討的。

無論如何,只要有了介紹,再加上好東西。 我要看的第一件事是Multimap,它可能是我最常使用的單個Guava功能。

多圖

那么,您多久需要一次如下所示的數據結構?

Map<String,List<MyClass>> myClassListMap test2= new HashMap<String,List<MyClass>>()

如果你像我一樣,相當頻繁。 而且您是否發現自己一遍又一遍地編寫相同的樣板代碼?

要將鍵/值對放入此映射,您需要首先檢查您的鍵是否已經存在列表,以及是否沒有創建該列表。 您最終將按照以下內容寫一些東西:

void putMyObject(String key, Object value) {List<Object> myClassList = myClassListMap.get(key);if(myClassList == null) {myClassList = new ArrayList<object>();myClassListMap.put(key,myClassList);}myClassList.add(value);
}

有點麻煩,如果需要檢查值的方法,該方法存在,刪除值,甚至遍歷整個數據結構。 那可能是很多代碼。

永遠不要擔心番石榴在這里!

就像標準的Java集合一樣,Guava定義了幾個接口和匹配的實現。 通常,您要對接口進行編碼,而只在創建接口時才擔心實現。 在這種情況下,我們對Multimaps感興趣。

因此,使用多圖,我們可以將數據結構聲明替換為以下內容:

Multimap<String,Object> myMultimap = ArrayListMultimap.create();

這里有幾件事要注意。 泛型類型聲明應該看起來非常熟悉,這正是您聲明普通Map的方式。

您可能一直希望在等號的右側看到new ArrayListMultimap<String,Object>() 。 好吧,所有Guava集合實現都提供了create方法,該方法通常更簡潔,并且具有不必重復泛型類型信息的優點。

實際上,番石榴在標準Java集合中增加了類似的功能。 例如,如果檢查com.google.common.collect.Lists ,則會看到靜態的newArrayList()newLinkedList()方法,因此即使使用標準Java集合,也可以利用這種簡潔性。 (我將在以后的文章中詳細介紹)。

因此,我們已經聲明并實例化了一個multimap,如何使用它們呢? 就像法線貼圖一樣簡單!

public class MutliMapTest {public static void main(String... args) {Multimap<String, String> myMultimap = ArrayListMultimap.create();// Adding some key/valuemyMultimap.put('Fruits', 'Bannana');myMultimap.put('Fruits', 'Apple');myMultimap.put('Fruits', 'Pear');myMultimap.put('Vegetables', 'Carrot');// Getting the sizeint size = myMultimap.size();System.out.println(size);  // 4// Getting valuesCollection<string> fruits = myMultimap.get('Fruits');System.out.println(fruits); // [Bannana, Apple, Pear]Collection<string> vegetables = myMultimap.get('Vegetables');System.out.println(vegetables); // [Carrot]// Iterating over entire Mutlimapfor(String value : myMultimap.values()) {System.out.println(value);}// Removing a single valuemyMultimap.remove('Fruits','Pear');System.out.println(myMultimap.get('Fruits')); // [Bannana, Pear]// Remove all values for a keymyMultimap.removeAll('Fruits');System.out.println(myMultimap.get('Fruits')); // [] (Empty Collection!)}
}

您可能想知道的一件事是,為什么get方法返回一個Collection而不是一個List ,這會有用得多。 確實會。 問題是有幾種不同的實現方式,一些使用Lists- ArrayListMultimapLinkedListMultimap等-某些使用Sets- HashMultimapTreeMultimap等。

要處理此問題(如果您需要直接使用列表中的列表或集合),需要定義幾個子接口。 ListMultimapSetMultimapSortedSetMultimap 。 這些都可以完成您期望的操作,它們返回集合的方法將返回approprite類型之一。

ListMutlimap<String,String> myMutlimap = ArrayListMultimap.create();List<string> myValues = myMutlimap.get('myKey');  // Returns a List, not a Collection.

這基本上就是他們的全部。 我建議您查看以下API: http : //docs.guava-libraries.googlecode.com/git-history/release09/javadoc/com/google/common/collect/Multimap.html ,在這里您可以找到各種實現,應該能夠找到適合您需求的產品。


參考: Multimaps – Tom's Programming Blog博客上的JCG合作伙伴 Tom Jefferys提供的Google Guava 。

翻譯自: https://www.javacodegeeks.com/2012/12/google-guava-multimaps.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qq群 html,我的群組-普通群組.html

&#xfeff;我的群組&#xff0d;普通群組$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resou…

查看PLC IP 端口_西門子828D數控系統X130接口通訊怪異現象(X130手動設置的 IP)...

西門子828D數控系統&#xff0c;調試PLC過程中遇到網絡通信怪異問題(不能直連非要加個路由器)&#xff0c;筆記本電腦的以太網網絡直接連接顯示網絡電纜被拔出&#xff0c;如下圖所示&#xff1a;奇怪&#xff0c;怎么出現這種情況了呢&#xff0c;因為我用這臺電腦調試過別的P…

基于嵌入式系統的gnash最小庫依賴關系

已經對gnash的依賴庫作了詳細的分析&#xff0c;下邊是必須依賴的庫&#xff1a;GIF Required libungif-devlibxml2 Required libxml2-devPNG Requir…

git 創建webpack項目_一次create-react-app創建項目升級webpack的流水賬

不再贅述為什么要升級webpack4&#xff0c;有興趣的小伙伴可以看一下 知乎&#xff1a;如何評價webpack4下面擼起袖子開干&#xff1a;克隆項目&#xff0c;新建分支git checkout -b feature_webpack_upgrade# 相當于以下兩句的簡寫git branch feature_webpack_upgradegit chec…

bzoj1263

貪心 n%31 分出一個4&#xff0c;其余用3&#xff0c;n%32&#xff0c;分出一個2&#xff0c;其余用3&#xff0c;然后高精度就行了 #include<bits/stdc.h> using namespace std; const int N 5005; struct BigInt {int len;int a[N];BigInt() { memset(a, 0, sizeof(a)…

c語言volatile_[技術]為什么單片機C語言編程時某一變量有時亂碼

最近一個項目里面&#xff0c;在KEIL中用C語言在單片機里面定義了一個狀態機全局變量&#xff0c;這個變量隨時會改變&#xff0c;用于切換觸摸屏的界面&#xff0c;可是程序運行中出現了一個問題&#xff0c;這個狀態機號總是出現了被莫名奇妙改變的問題&#xff0c;導致觸屏不…

沙箱Java代碼

在上一篇文章中&#xff0c;我們研究了如何保護移動Java代碼 。 這樣做的一種選擇是在籠子或沙箱中運行代碼。 這篇文章探討了如何為Java應用程序設置這樣的沙箱。 安全經理 Java中支持沙箱的安全性設施是java.lang.SecurityManager 。 默認情況下&#xff0c;Java在沒有Se…

微型計算機2017年9月上,2017年9月計算機一級考試WPS Office沖刺題

2017年9月計算機一級考試WPS Office沖刺題2017年下半年計算機一級考試將在9月份進行&#xff0c;為了方便考生備考計算機一級考試。下面是小編為大家帶來的計算機一級考試WPS Office沖刺題&#xff0c;歡迎閱讀。沖刺題一&#xff1a;1、PowerPoint 演示文稿和模板的擴展名是【…

七. 多線程編程5.創建多線程

到目前為止&#xff0c;我們僅用到兩個線程&#xff1a;主線程和一個子線程。然而&#xff0c;你的程序可以創建所需的更多線程。例如&#xff0c;下面的程序創建了三個子線程&#xff1a;// Create multiple threads.class NewThread implements Runnable { String name; /…

11尺寸長寬 iphone_弱電工程LED顯示屏尺寸規格及計算方法

前言&#xff1a;led屏幕在生活中&#xff0c;隨處可見&#xff0c;顯示屏、廣播屏等等&#xff0c;但是led尺寸怎么計算的&#xff0c;你知道嗎&#xff1f;今天我們一起了解一下led屏幕尺寸的計算方法。正文&#xff1a;一、點間距的計算1、各單元板常見型號及尺寸LED屏普遍是…

marquee標簽的使用

<!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>演示marquee</title><style type"text/css">*{padding: 0px;margin: 0px;}marquee{border: 1px solid purple;}img{width: 360px;height: auto;}&…

32位數據源中沒有mysql_[SpringBoot實戰]快速配置多數據源(整合MyBatis)

前言由于業務需求&#xff0c;需要同時在SpringBoot中配置兩套數據源&#xff08;連接兩個數據庫&#xff09;&#xff0c;要求能做到service層在調用各數據庫表的mapper時能夠自動切換數據源&#xff0c;也就是mapper自動訪問正確的數據庫。本文內容&#xff1a;在SpringbootM…

考研計算機冷門學校,考研5個冷門的985院校 別隨大流,這些幾所也是很不錯的...

導語&#xff1a;想必大家考研的目的有很多&#xff0c;最主要的就是想去更好的學校提升自己&#xff0c;大部分會肯定是會更傾向于985這類的院校&#xff0c;每年其實除了那些被“擠破頭”的985院校&#xff0c;其實還有不少“低調”的985院校是非常值得報考的&#xff0c;下面…

名為 cursor_jinserted 的游標不存在_質量工程師必須了解的測量常識,你不知道怎么行...

01測量器具的分類測量器具是一種具有固定形態、用以復現或提供一個或多個已知量值的器具。按用途的不同量具可分為以下幾類&#xff1a;1. 單值量具只能體現一個單一量值的量具。可用來校對和調整其它測量器具或作為標準量與被測量直接進行比較&#xff0c;如量塊、角度量塊等。…

window.onload事件

!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>window.onload</title><!--window.onload注意點&#xff1a;01.在整個頁面中只能存在一次&#xff0c;否則后面會覆蓋前面02.頁面中所有的內容加載…

bzoj4869

http://www.lydsy.com/JudgeOnline/problem.php?id4869 終于A了。。。參考了下dalao的代碼。。。 拓展歐幾里得定理&#xff0c;改了幾次就不變了&#xff0c;但是用的時候要在快速冪里判是不是要用。 #include<bits/stdc.h> using namespace std; typedef long long ll…

一張圖一個表——CSS選擇器總結

CSS選擇器總結&#xff1a; (這些表是一張圖片^_^) 看底部 完整思維導圖圖片和表格的下載地址&#xff1a;https://download.csdn.net/download/denlnyyr/10597820 &#xff08;我不想選擇要積分幣下載的&#xff0c;但那里最低必須選擇1個積分……&#xff09; 參考文獻&…

JavaOne 2012覆蓋率

年度Java盛會JavaOne會議于9月30日至10月4日在舊金山舉行。 進行了許多有趣的演示&#xff0c;再次證明了健康的Java生態系統。 Java Code Geeks未能參加會議&#xff0c;但是我們的JCG合作伙伴Dustin Marx出席了會議&#xff0c;并且慷慨地提供了有關該事件的完整報道&#x…

native層 安卓_安卓逆向——拼xx協議java層分析

制丨阿星整理丨阿星老鐵們大家好&#xff0c;今天小編給大家帶來很實用的技巧叫拼xx協議java層分析&#xff0c;有啥不足的地方望大家指點指點&#xff01;首先抓包 反編譯這個時間段我們方法剖析一下找到onclick 看他的走向找到方法的地方都是在進行寫入 所以我們直接分析結果…

對口高考計算機vf試題,計算機對口升學模擬答案.doc

2013年計算機專業對口高考模擬試題二一、選擇題1&#xff0e;計算機硬件系統由( )組成A.CPU和內存 B.控制器和運算器 C.主機和外設 D.CPU、內存和外存2.下列敘述中&#xff0c;正確的說法是( )。A.鍵盤、鼠標、光筆、數字化儀和掃描儀都是輸入設備B.打印機、顯示器、數字化儀都…