首页 > 技术文章 > Guava增强for循环

Alex--Yang 2013-10-15 23:27 原文

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开发者的学习和亲睐。

 

 

 

 

 

推荐阅读