在很多人眼中,Java已經是一門垂垂老矣的語言,但并不妨礙Java世界依然在前進。如果你曾離開Java,云游于其它世界,或是每日只在遺留代碼中掙扎,或許是時候抬起頭,看看老Java中的新東西。
Guava
一句話,只要你做Java項目,就應該用Guava。
guava是Google出品的一套Java核心庫,在我看來,它甚至應該是JDK的一部分。作為一個Java程序員,如果你沒抱怨過JDK的設計,只能說明一點,你寫得程序還是太少。正是JDK設計不彰,才有了一些項目來補充JDK的不足。如果說老Java程序員應該聽說過Apache Commons Lang,那新Java程序員該知道的就是Guava了。
老Java程序員更多的是知道Google Collections,不妨到它的主頁上走一遭,你會看到這個庫已經改名為Guava。事實上,Guava并不直接等于Google Collections,Guava是一個超集。Guava實在太強大了,要想展現它的強大,需要專門的介紹,這里就不展開了。
下面以一個統計單詞出現個數的小程序作為這個段落的結尾,雖然無法與許多其它語言的實現相提并論,但作為一個Java程序員,你不妨想一下按照傳統方式,這段代碼應該是什么樣子。
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設計得差到什么份上,才會把自己差不多的API全部Deprecated掉。java.util.Date便是這樣的奇葩。因為它的API幾乎都是反直覺的,幾乎所有敢于用它的Java程序員都吃過它的虧。想初始化個2013年的第一天,還真不那么容易:
Date firstDayOf2013 = new Date(113, 0, 1);
如果你是個Java新手,你能猜出113是從哪來的嗎?(好吧,它是2013-1900,至于為什么是1900,這真得問API的設計者了)。
Joda Time就是人們實在無法忍受這樣東西的產物。同樣的代碼用Joda Time實現:
DateTime firstDayOf2013 = new DateTime().withDate(2013, 1, 1);
無論如何,你知道這能看出這些參數的含義了。不只如此,你還可以計算兩天后是什么日子:
firstDate.plusDays(2);
日期格式化,也是JDK Date系列API里一大特色,你必須把代碼寫成下面這樣:
new SimpleDateFormat("yyyy.MM.dd").format(firstDayOf2013)
作為一個初始化很慢的構造函數,你還必須每次調用,因為它不是線程安全的。同樣的代碼,在Joda Time里,我們可以用DateTimeFormatter:
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");
...
formatter.print(dateTime);
請盡管放心大膽把formatter聲明成一個字段,因為它是線程安全的。
當然,Joda Time的強大遠不止于此。當然,JDK也并不是那么完全的自暴自棄,于是,有了一個JSR 310專門設計新的Date API。JSR 310的spec lead是Steven Colebourne,此人正是Joda Time的作者。