這個夏天的早些時候,我已經極力向我的所有同事推薦了 Google Collections 。 Kevin Bourrillion說他的一個同事告訴他“沒有使用Google Collections前編程就像把一隻手綁在背後”。
我灰常同意Kevin的這個同事!
可能文章的標題有點奇怪。我指的是“編寫漂亮代碼”。我猜我應該說“簡潔的”Java代碼,但是,它們意思可不一樣(譯者注:漂亮的代碼看著很爽,簡潔的不一定爽)。
在我準備開始賣力的吆喝這個我最最喜歡的Java類庫前,我有幾個額問題要問問你:
多少次你寫了像下面一樣的代碼:
或者像這樣的不堪入目的代碼:
或者有很多的if和else :-(
又有多少次你寫了像下面這樣的代碼,只為了從一個文件中讀一點點東西?
好吧,我想說… 這都 TM 什麼玩意?!
我們已經有Apache Commons Collections很多年了。那為什麼我們還需要另外一個collections庫呢?我看過很多像這樣的評論:
“任何有一段時間開發經驗的Java程序員都會積累這些類型的實用的工具類”
好吧,是的,這對於大多數開發者來說可能是(應該是)對的。但是,有太多理由來擺脫垃圾代碼和重用漂亮的工具類!在這個博客裡,我將要告訴你一些的確引起我求知慾-讓我沉溺於其中的事情,那就是Google Collections。
正如Jared Levy 曾說過的:
這個庫簡化了你的代碼,使它易寫、易讀、易於維護。它能提高你的工作效率,讓你從大量重複的底層代碼中脫身。
此外,我會給你們展示一下Guava裡面包含的很多非常酷的功能,讓你們看看如何用它來寫出更漂亮的代碼,一旦看到這些,你們就會和以前那種僵化的令人討厭的寫代碼方式說拜拜了。
Google Guava 是 Google 為 Java 1.6 編寫的核心庫。它仍然不是一個很成熟的庫,在未來幾個月還將不斷的變化。Google Collections 將在 1.0 版本發佈時將成為 Guava 的一部分。Guava (和 Google Collections) 已經率先被很多 Google 開發者使用。支持該項目的開發者有 Kevin Bourrillion, Jared Levy, Crazy Bob Lee, Josh Bloch(!) (Google 的 Java 首席架構師) 和 limpbizkit (我們找不到這傢伙的真實姓名). Google Collections 在 2007 年就已經有了,但 Guava 是在 2009年9月推出的。
作為這個系列的博客,我將向你介紹 Google Collections 並告訴你使用 Guava 和 Google Collections 能為你帶來什麼好處。包括代碼量的減少以及新的更快的數據結構。在第二部分我們將深入探討 Guava 和 Collections 的一些高級特性。
1、Google Collections一覽
顯然一篇博文不能深入地覆蓋Google Collections的方方面面,所以我決定把時間放在我日常編碼中使用到的基礎且不失強大的特性上,首先,不要這麼做:
要這麼做:
或者更甚者直接使用靜態導入:
棒,不是嗎?多虧有泛型和寫Collections的哥們提供給我們的這些方便工廠方法,我們不再需要寫一些Java本身應該自帶的東西。好吧,我知道這些會是JDK 7裡的一部分,那當然很好,不過Google Collections現在就有這些功能。
類似於com.google.common.collect.Maps提供的這些靜態工具方法,Lists和Sets也有:
2、操作lists和maps
當你在寫單元測試時,經常會構造一些測試數據,可能是list、map、set等,對於一些像我一樣草率的人來說,測試代碼中會經常看到類似下面的語句:
其實我也知道,這幾行代碼看起來很爛,我只是想用一些測試數據構造一個不可變的list而已,我希望能像下面這樣寫一行代碼搞定這些。。如何辦到?好吧,這很簡單!
Map也一樣
我現在慢慢的越來越喜歡這種簡單而又有效的寫代碼的方式,我還想縮短一下上面的代碼,但是由於ImmutableList和ImmutableMap都有of方法,不能使用靜態導入。不過有一個變通的方法就是說在我們自己的集合工具中包裝這些創建工廠方法,那麼對於不可變的list和map我只需要簡單的這麼寫就好:
或者
而且如果我想構造填充一個ArrayList(或者一個HashMap),我可以這樣:
兩種方式都可以,選擇權在你手上,很明顯,這種較之前面的方式更靈活優雅一些,你說呢? 除去可以使用方便乾淨的方式來創建並填充集合類,我們也提供了很多額外的工具方法,比如過濾,對set取交集和並集,排序等等一些更優雅的方法,我將會在第二部分中講解它們。
3. Guava走馬觀花
最後,但並非不重要,我將向你展示一下如果使用Guava來處理本文開頭留下來的兩個問題:
1. 從文件中按行讀取內容
2. 比較兩個基本類型
3.把一個List轉換為int數組:
Guava為我們提供了對Core Java類庫全面的擴展,我們可以使用com.google.common.primitices包下的Ints,Doubles,Floats,Shorts,Bytes以及Bools等工具類操作基本類型的數據;com.google.common.io包提供了操作streams,buffers以及files等等,而且併發包中提供了一些像Futures,Callables以及Executors等方便的工具類來減輕我們寫併發代碼的痛苦。除此之外,Guava提供了對Collections的增強,以及非常優雅的CharMatcher、Joiner以及Splitter類。
下次我們會深入Guava 的高級功能,探索一下集合的用法,看看怎樣通過Multimap使java的功能更加強大,如何用mapping功能來轉換集合。請拭目以待。如果你們也用過Guava或者Google Collections請分享一下你們的心得。
關注“教授學苑”,期待帶給你快樂的開發知識!