使用Google Collections的理由
Google Collections終于發(fā)布了1.0版,本文是JavaLobby上的一篇博文,作者講述了應該使用Google Collections的若干理由,大家有興趣的話也可以體驗一下。(2010.01.08最后更新)在去年底看到Google Collections發(fā)布了它的1.0版之后,我想我應該看看與JDK默認提供的集合框架相比,使用Google Collections類庫會有什么好處。Google Collections的發(fā)行包是一個zip文件,包含了一個jar文件,源文件和Javadoc文件。
Java Collections API就是被用來擴展的,而Google Collections則擴展的很好。很快,我就發(fā)現(xiàn)該類庫最好的特性之一是它包含了MultiMap類。
為了證明這一點,讓我們使用一個電話薄的例子,在這個例子中每個人都可一個或多個電話號碼。事先,我已將電話號碼存入每個人的一個單獨的List中,如下所示:
Map<Person, List<PhoneNumber>> phoneBook = new HashMap<Person, List<PhoneNumber>>();
使用MultiMap,將變得十分簡潔:
Multimap <Person, PhoneNumber> newPhoneBook = ArrayListMultimap.create();
且在使用MultiMap時,就沒必要管理每個人的電話號碼列表了。當我要加一個新的電話號碼時,只需這么做:
Person me = new Person("James");
newPhoneBook.put(me, new PhoneNumber(111));
newPhoneBook.put(me, new PhoneNumber(201));
newPhoneBook.put(me, new PhoneNumber(111));
newPhoneBook.put(me, new PhoneNumber(201));
而不是使用以前的繁冗方法去管理ArrayList:
Person me = new Person("James");
if(phoneBook.get(me) == null)
{
phoneBook.put(me, new ArrayList<PhoneNumber>());
}
if(phoneBook.get(me) == null)
{
phoneBook.put(me, new ArrayList<PhoneNumber>());
}
phoneBook.get(me).add(new PhoneNumber(111));
對需要處理的數(shù)據(jù)進行管理這個話題,Precondition允許你對傳入的參數(shù)進行校驗。
Preconditions.checkNotNull(me);
我知道在Java中達到上述效果也可使用斷言,但上述方法可使你的校驗總是有效。你能方便地進行校驗,通過判定一個表達式,也可為特定的參數(shù)拋出IllegalArgumentException。
Preconditions.checkArgument((i > 0), "The value i has to be greater than zero");
還有許多其它有用的特性,例如快速創(chuàng)建不可變集合的能力:
ImmutableList<Integer> numbers = ImmutableList.of(1, 2, 3, 5, 8, 13, 21, 34);
以前,你需要創(chuàng)建一個普通的List,然后再調(diào)用Collections.unmodifiableList()方法。
為了對該類庫有一個很好的概覽,查看由Kevin Bourrillion在2008年給出的一段視頻。
總之,該類庫使你能以更優(yōu)雅的方法來處理集合對象,并使你的代碼更具可讀性且更扼要。