天天看點

你應該更新的 Java 知識你應該更新的 Java 知識

作者:dreamhead

出處:《你應該更新的Java知識》系列

你應該更新的 Java 知識

Tag: 你應該更新的Java知識  Java  Guava  集合

版權聲明:轉載時請以超連結形式标明文章原始出處和作者資訊及本聲明

http://www.blogbus.com/dreamhead-logs/232899025.html

你應該更新的Java知識之常用程式庫(一)

你應該更新的Java知識之常用程式庫(二)

你應該更新的Java知識之建構工具

你應該更新的Java知識之Observer

在Java裡,如何初始化一個List呢?

我知道,你可以毫不費力地寫出這樣的代碼:

List<String> names = new ArrayList<String>();

names.add("dreamhead");

這幾乎是在Java 5/6風格的代碼中随處可見的,但不知道你怎麼想,反正這樣的代碼讓我覺得很不爽。

首先,變量聲明裡存在重複,明明我已經知道它是一個String的List,還要再後面再說一次。如果你嘗試過一些具有類型推演功能的語言,你就會知道,這種重複完全是可以由編譯器處理掉的。Java 7也認為這樣的代碼不好,是以,它給我們提供了一個新的文法:

List<String> names = new ArrayList<>();

其實,即便是Java 5/6,我們也是有辦法寫出不那麼備援的代碼。Guava已經為我們提供了一個解決方案,是以,同樣的代碼如果用Guava來寫,它會是這樣:

List<String> names = newArrayList();

這裡,它利用了編譯器的類型推演功能保證了類型的正确性。從代碼上看,它甚至要比Java 7提供的解決方案鍵入的字元還少。

這隻是第一步,再有我還要在List裡面放入内容,讓我們繼續來看在Guava裡面怎麼做。

List<String> names = newArrayList("dreamhead");

一行代碼搞定,因為支援變參,是以,我們甚至可以一次放入很多元素。但是,這不是終點。

在很多數情況下,使用List時,我們并不關心其具體的類型,隻是把它當做一組資料來用,而并不是為了動态添加一些東西。這個時候,我們隻要有一個不變的List就可以了。Guava裡的ImmutableList就可以很好地把我們的意圖表現出來。一方面,它實作了List接口,你可以把它當做一個List來用,另一方面,如果試圖改變其中的内容,它會抛出異常。

就我們這裡讨論的内容而言,它的初始化方法更為簡單:

List<String> names = of("dreamhead");

這裡讨論的隻是List,但大多數内容同樣适用于Set和Map,另外兩種我們最常用的資料結構。

需要額外加以解釋的是,of其實是為少量元素初始化打開的友善之門。是以,如果檢視of的實作,你會發現List最多支援12個元素的處理,而Set隻有6個,隻是因為可變參數的存在,它可以支援到很多。但是,Map的則不同,它隻有5對,因為它的鍵值對必須成對出現。如果你需要元素很大的ImmutableMap,一個更好的解決方法是采用Builder,下面是一個例子:

ImmutableMap<String, String> contentTypeMap = ImmutableMap.<String, String>builder()

           .put("png", "image/png")

           .put("gif", "image/gif")

           .put("jpg", "image/jpeg")

           .put("jpeg", "image/jpeg")

           .put("tiff", "image/tiff")

           .put("css", "text/css")

           .put("html", "text/html")

           .put("txt", "text/plain")

           .put("js", "application/x-javascript")

           .put("json", "application/json")

           .put("pdf", "application/pdf")

           .put("zip", "application/zip")

           .put("xml", "text/xml")

           .build();

在程式設計領域,有一個經典的說法,語言設計就是程式庫設計,程式庫設計就是語言設計。像List、Map這樣的集合類型,有些語言把它放進了文法,使得它用起來更簡單。像Java這樣做起事來一闆一眼的程式設計語言,如果有了好的程式庫支撐,也可以讓它相對友善,Guava在這方面做了一個很好的嘗試。

對普通的Java程式員而言,是時候抛棄繁重的Java舊文法,擁抱新時代的Java了。