Guava的前身是Google Collections,是Google開發出的一個開源Java經常使用類庫,包含了一些集合的便捷操做API。本文經過一些經常使用的例子來剖析Guava的奇妙之處。java
Guava是如何簡化for循環的呢,直接上一段例子來講明:編程
若是想要將一個字符數組中字符的元素剔除而且用逗號隔開,原始作法:數組
for(int i = 0; i < array.length; i++){ if(array[i] != null){ result.append(array[i]).append(','); } }
Guava類庫極度簡化次操做,以一種函數式編程思想鏈式的調用方法簡化了實現app
String s = Joiner.on(「,」).skipNulls().join(array);
Guava還有比着這強大的功能,閒話少說,下面介紹三種項目經常使用簡化for循環的用法:ide
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; } }); }
用法:在集合中找出知足某個條件的全部元素,返回一個知足條件的新集合spa
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開發者的學習和親睞。