Guava的前身是Google Collections,是Google開發出的一個開源Java常用類庫,包含了一些集合的便捷操作API。本文通過一些常用的例子來剖析Guava的奇妙之處。
Guava是如何簡化for循環的呢,直接上一段例子來說明:
如果想要將一個字符數組中字符的元素剔除並且用逗號隔開,原始做法:
for(int i = 0; i < array.length; i++){ if(array[i] != null){ result.append(array[i]).append(','); } }
Guava類庫極度簡化次操作,以一種函數式編程思想鏈式的調用方法簡化了實現
String s = Joiner.on(“,”).skipNulls().join(array);
Guava還有比着這強大的功能,閑話少說,下面介紹三種項目常用簡化for循環的用法:
private List<Dog> dogs = ImmutableList.of( new Dog("Jeff", 0.6f, MALE, new DateTime(2013, 9, 1, 0, 0, 0, 0)), new Dog("Vivian", 1f, FEMALE, new DateTime(2013, 1, 2, 0, 0, 0, 0)));//初始化數據
1. 將一個集合元素的某一個或多個字段組成一個新的集合:
public Collection getNameList { return Collections2.transform(dogs, new Function<Dog, String>() { @Override public String apply(Dog dog) { return dog.getName(); } }); }
用法:可以將集合里的每個對象拿出來對其進行操作,並將操作結果作為新集合的元素,返回產生的新集合。
2.篩選出集合中滿足某些屬性的對象
public Collection applyAge(final float from, final float to) { return Collections2.filter(dogs, new Predicate<Dog>() { @Override public boolean apply(Dog dog) { return dog.getAge() > from && dog.getAge() < to; } }); }
用法:在集合中找出滿足某個條件的所有元素,返回一個滿足條件的新集合
3.在集合中找到一個滿足條件的對象
public Object getBirthdayApplyMonthDog(final int month) { Optional<Dog> optional = Iterables.tryFind(dogs, new Predicate<Dog>() { @Override public boolean apply(Dog dog) { return dog.getBirthday().getMonthOfYear() == month; } }); if (optional.isPresent()) { return optional; } else { return "not found"; } }
用法:在集合中找到第一個滿足條件的元素,並且返回一個被Optional封裝的對象,Optional對象可以避免開發人員沒有判斷是否為null而產生的空指針異常,是Guava提供用來包裝任何對象的對象。
4. 在2和3的實例中,tryFind和filter方法都需要傳一個Predicate的對象,這個對象是用來判斷哪些符合條件的一個借口,需要自己實現,與此同時,Guava也提供了能夠讓多個條件並列或者同時滿足的條件組合方法
public Object getFirstDogAppluAgeAndGender(float age, String gender) { Optional<Dog> optional = Iterables.tryFind(dogs, and(getApplyAge(age), applyGenderDog(gender))); if(optional.isPresent()) { return optional.get(); } return Optional.absent(); } private Predicate<Dog> getApplyAge(final float age) { return new Predicate<Dog>() { @Override public boolean apply(Dog dog) { return dog.getAge() > age; } }; }
用法:提供了 and(or)方法來組合一個判斷條件,豐富了tryFind和filter的判斷條件邏輯。
總而言之,Guava給for循環帶來了飛躍性的改進,讓糟糕的for與if,else的冗余組合變得簡單易懂,讓代碼變得更優美,可讀性更高,確實值得所有java開發者的學習和親睞。