這個(gè)夏天的早些時(shí)候,我已經(jīng)極力向我的所有同事推薦了 Google Collections 。 Kevin Bourrillion說(shuō)他的一個(gè)同事告訴他“沒(méi)有使用Google Collections前編程就像把一只手綁在背后”。 我灰常同意Kevin的這個(gè)同事! 可能文章的標(biāo)題有點(diǎn)奇怪。我指的是“編寫(xiě)漂亮代碼”。我猜我應(yīng)該說(shuō)“簡(jiǎn)潔的”Java代碼,但是,它們意思可不一樣(譯者注:漂亮的代碼看著很爽,簡(jiǎn)潔的不一定爽)。 在我準(zhǔn)備開(kāi)始賣(mài)力的吆喝這個(gè)我最最喜歡的Java類庫(kù)前,我有幾個(gè)額問(wèn)題要問(wèn)問(wèn)你: 多少次你寫(xiě)了像下面一樣的代碼:
或者像這樣的不堪入目的代碼:
或者有很多的if和else :-( | se77en |
又有多少次你寫(xiě)了像下面這樣的代碼,只為了從一個(gè)文件中讀一點(diǎn)點(diǎn)東西?:
好吧,我想說(shuō)… 這是什么TM玩意?我們已經(jīng)有Apache Commons Collections很多年了。那為什么我們還需要另外一個(gè)collections庫(kù)呢?我看過(guò)很多像這樣的評(píng)論:
好吧,是的,這對(duì)于大多數(shù)開(kāi)發(fā)者來(lái)說(shuō)可能是(應(yīng)該是)對(duì)的。但是,有太多理由來(lái)擺脫垃圾代碼和重用漂亮的工具類!在這個(gè)博客里,我將要告訴你一些的確引起我求知欲-讓我沉溺于其中的事情,那就是Google Collections。 | se77en |
正如Jared Levy 曾說(shuō)過(guò)的:
此外,我會(huì)給你們展示一下Guava里面包含的很多非??岬墓δ?,讓你們看看如何用它來(lái)寫(xiě)出更漂亮的代碼,一旦看到這些,你們就會(huì)和以前那種僵化的令人討厭的寫(xiě)代碼方式說(shuō)拜拜了。 | 可觀 |
Google Guava 是 Google 為 Java 1.6 編寫(xiě)的核心庫(kù)。它仍然不是一個(gè)很成熟的庫(kù),在未來(lái)幾個(gè)月還將不斷的變化。Google Collections 將在 1.0 版本發(fā)布時(shí)將成為 Guava 的一部分。Guava (和 Google Collections) 已經(jīng)率先被很多 Google 開(kāi)發(fā)者使用。支持該項(xiàng)目的開(kāi)發(fā)者有 Kevin Bourrillion, Jared Levy, Crazy Bob Lee, Josh Bloch(!) (Google 的 Java 首席架構(gòu)師) 和 limpbizkit (我們找不到這家伙的真實(shí)姓名). Google Collections 在 2007 年就已經(jīng)有了,但 Guava 是在 2009年9月推出的。 作為這個(gè)系列的博客,我將向你介紹 Google Collections 并告訴你使用 Guava 和 Google Collections 能為你帶來(lái)什么好處。包括代碼量的減少以及新的更快的數(shù)據(jù)結(jié)構(gòu)。在第二部分我們將深入探討 Guava 和 Collections 的一些高級(jí)特性。 | 紅薯 |
Google Collections一覽 顯然一篇博文不能深入地覆蓋Google Collections的方方面面,所以我決定把時(shí)間放在我日常編碼中使用到的基礎(chǔ)且不失強(qiáng)大的特性上,首先,不要這么做:
類似于com.google.common.collect.Maps提供的這些靜態(tài)工具方法,Lists和Sets也有:
| JoeyBlue |
操作lists和maps 當(dāng)你在寫(xiě)單元測(cè)試時(shí),經(jīng)常會(huì)構(gòu)造一些測(cè)試數(shù)據(jù),可能是list、map、set等,對(duì)于一些像我一樣草率的人來(lái)說(shuō),測(cè)試代碼中會(huì)經(jīng)??吹筋愃葡旅娴恼Z(yǔ)句:
兩種方式都可以,選擇權(quán)在你手上,很明顯,這種較之前面的方式更靈活優(yōu)雅一些,你說(shuō)呢? 除去可以使用方便干凈的方式來(lái)創(chuàng)建并填充集合類,我們也提供了很多額外的工具方法,比如過(guò)濾,對(duì)set取交集和并集,排序等等一些更優(yōu)雅的方法,我將會(huì)在第二部分中講解它們。 | ![]() JoeyBlue |
靜態(tài)導(dǎo)入和Eclipse模板 在這之前,我想先告訴你我在寫(xiě)代碼時(shí),是如果借用Eclipse的Code模板功能更高效的使用集合類的。(我假設(shè)你了解在IDEA或者其他IDE中也存在類似的功能,你可以根據(jù)這部分?jǐn)⑹鲎龀鱿鄳?yīng)的擴(kuò)展或變通) 作為一個(gè)Eclipse的用戶,我非常喜歡快捷鍵(參照這篇介紹Eclipse快捷鍵的博文:MouseFeed and how you can easily learn Eclipse shortcuts) OK,Ctrl+space是你們的好朋友!他也是代碼自動(dòng)補(bǔ)全的快捷鍵。(譯者注:當(dāng)然。在中國(guó),由于這個(gè)快捷鍵和切換輸入法沖突,一般都設(shè)置為了“Alt+/”作為代碼補(bǔ)全的快捷鍵) 在Eclipse下你可以創(chuàng)建一個(gè)模板來(lái)綁定到一個(gè)自動(dòng)補(bǔ)全的快捷關(guān)鍵字上,這也是魔力所在! 相對(duì)于鍵入Maps.newHashMap()來(lái)創(chuàng)建一個(gè)HashMap,或者干脆使用靜態(tài)導(dǎo)入,就可以簡(jiǎn)單的鍵入newHashMap()來(lái)創(chuàng)建一個(gè)HashMap,我只是簡(jiǎn)單的敲入newH,按下ctrl+space,見(jiàn)證奇跡的時(shí)刻到了! 在Eclipse菜單欄選擇Window -> Preferences,進(jìn)入Java -> Editor -> Templates,點(diǎn)擊“New”. Name處就是你想敲入的快捷關(guān)鍵字,我通常命名為我的方法名,比如在這里,就是“newHashMap”. 加上你喜歡的描述,比如”Import static Maps.newHashMap“,并增加下面的內(nèi)容:
| ![]() JoeyBlue |
Guava走馬觀花 最后,但并非不重要,我將向你展示一下如果使用Guava來(lái)處理本文開(kāi)頭留下來(lái)的兩個(gè)問(wèn)題: 1.從文件中按行讀取內(nèi)容
| ![]() JoeyBlue |
可以從這里獲得源碼: 下次我們會(huì)深入Guava 的高級(jí)功能,探索一下集合的用法,看看怎樣通過(guò)Multimap使java的功能更加強(qiáng)大,如何用mapping功能來(lái)轉(zhuǎn)換集合。請(qǐng)拭目以待。如果你們也用過(guò)Guava或者Google Collections請(qǐng)分享一下你們的心得。 |
聯(lián)系客服