你應(yīng)該更新的Java知識之常用程序庫(一)

在很多人眼中,Java已經(jīng)是一門垂垂老矣的語言,但并不妨礙Java世界依然在前進(jìn)。如果你曾離開Java,云游于其它世界,或是每日只在遺留代碼中掙扎,或許是時候抬起頭,看看老Java中的新東西。

Guava

一句話,只要你做Java項目,就應(yīng)該用Guava。

guavaGoogle出品的一套Java核心庫,在我看來,它甚至應(yīng)該是JDK的一部分。作為一個Java程序員,如果你沒抱怨過JDK的設(shè)計,只能說明一點,你寫得程序還是太少。正是JDK設(shè)計不彰,才有了一些項目來補充JDK的不足。如果說老Java程序員應(yīng)該聽說過Apache Commons Lang,那新Java程序員該知道的就是Guava了。

Java程序員更多的是知道Google Collections,不妨到它的主頁上走一遭,你會看到這個庫已經(jīng)改名為Guava。事實上,Guava并不直接等于Google Collections,Guava是一個超集。Guava實在太強大了,要想展現(xiàn)它的強大,需要專門的介紹,這里就不展開了。

下面以一個統(tǒng)計單詞出現(xiàn)個數(shù)的小程序作為這個段落的結(jié)尾,雖然無法與許多其它語言的實現(xiàn)相提并論,但作為一個Java程序員,你不妨想一下按照傳統(tǒng)方式,這段代碼應(yīng)該是什么樣子。

String content = Files.toString(new File(args[0]), Charset.defaultCharset());

Iterable texts = Splitter.on(CharMatcher.WHITESPACE)

.omitEmptyStrings()

.trimResults()

.split(content);

Multiset collection = HashMultiset.create(texts);

Joda Time

你覺得一個API設(shè)計得差到什么份上,才會把自己差不多的API全部Deprecated掉。java.util.Date便是這樣的奇葩。因為它的API幾乎都是反直覺的,幾乎所有敢于用它的Java程序員都吃過它的虧。想初始化個2013年的第一天,還真不那么容易:

Date firstDayOf2013 = new Date(113, 0, 1);

如果你是個Java新手,你能猜出113是從哪來的嗎?(好吧,它是2013-1900,至于為什么是1900,這真得問API的設(shè)計者了)。

Joda Time就是人們實在無法忍受這樣?xùn)|西的產(chǎn)物。同樣的代碼用Joda Time實現(xiàn):

DateTime firstDayOf2013 = new DateTime().withDate(2013, 1, 1);

無論如何,你知道這能看出這些參數(shù)的含義了。不只如此,你還可以計算兩天后是什么日子:

firstDate.plusDays(2);

日期格式化,也是JDK Date系列API里一大特色,你必須把代碼寫成下面這樣:

new SimpleDateFormat("yyyy.MM.dd").format(firstDayOf2013)

作為一個初始化很慢的構(gòu)造函數(shù),你還必須每次調(diào)用,因為它不是線程安全的。同樣的代碼,在Joda Time里,我們可以用DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");

...

formatter.print(dateTime);

請盡管放心大膽把formatter聲明成一個字段,因為它是線程安全的。

當(dāng)然,Joda Time的強大遠(yuǎn)不止于此。當(dāng)然,JDK也并不是那么完全的自暴自棄,于是,有了一個JSR 310專門設(shè)計新的Date API。JSR 310spec leadSteven Colebourne,此人正是Joda Time的作者。

北大青鳥網(wǎng)上報名
北大青鳥招生簡章