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