Guava加強for循環

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開發者的學習和親睞。

相關文章
相關標籤/搜索