Guava的前身是Google Collections,是Google开发出的一个开源Java常用类库,包含了一些集合的便捷操作API。本文通过一些常用的例子来剖析Guava的奇妙之处。

Guava是如何简化for循环的呢,直接上一段例子来说明:

如果想要将一个字符数组中字符的元素剔除并且用逗号隔开,原始做法:

  1. for(int i = 0; i < array.length; i++){
  2. if(array[i] != null){
  3. result.append(array[i]).append(',');
  4. }
  5. }

Guava类库极度简化次操作,以一种函数式编程思想链式的调用方法简化了实现

  1. String s = Joiner.on(“,”).skipNulls().join(array);

Guava还有比着这强大的功能,闲话少说,下面介绍三种项目常用简化for循环的用法:

  1. private List<Dog> dogs = ImmutableList.of(
  2. new Dog("Jeff", 0.6f, MALE, new DateTime(2013, 9, 1, 0, 0, 0, 0)),
  3. new Dog("Vivian", 1f, FEMALE, new DateTime(2013, 1, 2, 0, 0, 0, 0)));//初始化数据

1. 将一个集合元素的某一个或多个字段组成一个新的集合:

  1. public Collection getNameList {
  2. return Collections2.transform(dogs, new Function<Dog, String>() {
  3. @Override
  4. public String apply(Dog dog) {
  5. return dog.getName();
  6. }
  7. });
  8. }

用法:可以将集合里的每个对象拿出来对其进行操作,并将操作结果作为新集合的元素,返回产生的新集合。

2.筛选出集合中满足某些属性的对象  

  1. public Collection applyAge(final float from, final float to) {
  2. return Collections2.filter(dogs, new Predicate<Dog>() {
  3. @Override
  4. public boolean apply(Dog dog) {
  5. return dog.getAge() > from && dog.getAge() < to;
  6. }
  7. });
  8.  
  9. }

用法:在集合中找出满足某个条件的所有元素,返回一个满足条件的新集合

3.在集合中找到一个满足条件的对象

  1. public Object getBirthdayApplyMonthDog(final int month) {
  2. Optional<Dog> optional = Iterables.tryFind(dogs, new Predicate<Dog>() {
  3. @Override
  4. public boolean apply(Dog dog) {
  5. return dog.getBirthday().getMonthOfYear() == month;
  6. }
  7. });
  8. if (optional.isPresent()) {
  9. return optional;
  10. } else {
  11. return "not found";
  12. }
  13. }

用法:在集合中找到第一个满足条件的元素,并且返回一个被Optional封装的对象,Optional对象可以避免开发人员没有判断是否为null而产生的空指针异常,是Guava提供用来包装任何对象的对象。

4. 在2和3的实例中,tryFind和filter方法都需要传一个Predicate的对象,这个对象是用来判断哪些符合条件的一个借口,需要自己实现,与此同时,Guava也提供了能够让多个条件并列或者同时满足的条件组合方法

  1. public Object getFirstDogAppluAgeAndGender(float age, String gender) {
  2. Optional<Dog> optional = Iterables.tryFind(dogs, and(getApplyAge(age), applyGenderDog(gender)));
  3. if(optional.isPresent()) {
  4. return optional.get();
  5. }
  6. return Optional.absent();
  7. }
  8.  
  9. private Predicate<Dog> getApplyAge(final float age) {
  10. return new Predicate<Dog>() {
  11. @Override
  12. public boolean apply(Dog dog) {
  13. return dog.getAge() > age;
  14. }
  15. };
  16. }

用法:提供了 and(or)方法来组合一个判断条件,丰富了tryFind和filter的判断条件逻辑。

总而言之,Guava给for循环带来了飞跃性的改进,让糟糕的for与if,else的冗余组合变得简单易懂,让代码变得更优美,可读性更高,确实值得所有java开发者的学习和亲睐。

Guava增强for循环的更多相关文章

  1. 增强for循环(forearch)

    增强for循环是为了简化在遍历数组需要先获得数组的长度或者在遍历集合中的元素的时候需要使用迭代器的操作. 引入时间:JDK1.5 语法格式: for(数据类型 变量 :需要迭代的数组或者集合){ } ...

  2. Java学习——增强for循环、switch

    增强for循环 Java5引入了一种主要用于数组的增强型for循环. 例子 public class ForTest { public static void main(String args[]){ ...

  3. 增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)

    总结: 1.For-Each循环的缺点:丢掉了索引信息. 当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息. ...

  4. 关于增强for循环

    1 增强for循环增强for循环是for的一种新用法!用来循环遍历数组和集合. 1.1 增强for的语法for(元素类型 e : 数组或集合对象) {}例如:int[] arr = {1,2,3};f ...

  5. 【Java基础】增强for循环要注意陷阱

    什么是增强for循环 增强for循环是一种简单模式的for循环,为了方便数组和集合的遍历而存在. int[] arr = new int[]{1, 2, 3, 4, 5, 6}; for (int a ...

  6. (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型

    Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...

  7. 增强for循环用法

    1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的, 但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容.不能获取 ...

  8. 增强for循环赋值

    增强for循环赋值 代码如下: double[] testList01 = new double[5]; java.util.Scanner sc = new java.util.Scanner(Sy ...

  9. java中的Iterator与增强for循环的效率比较

    最近在优化代码时遇到了这个问题:Iterator与增强for循环到底哪个效率高?之前在学习的时候,好像记着老师说过遍历集合(如list)时,使用iterator好像正规一些,因为是专用的,但是运行效率 ...

随机推荐

  1. 【转】【VC】VC程序运行时间测试函数

    1:Sleep函数 使用: sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟: Linux下表示1000秒,Linux ...

  2. jquery-插入兄弟元素

    1.after方法 在匹配元素集合中的每个元素的 后面 插入参数所指定的内容,作为其兄弟节点 参数类型说明: 1)普通字符串(可包含各种html标签) $('div').after('html字符串' ...

  3. Unity的加载路径

    1.Resources 路径 只读 不能动态的修改 存放内容 预制体(prefabs) - 不容易变化的预制体 prefabs打包的时候 会自动过滤不需要的资源 有利于减小资源大小 主线程加载 Res ...

  4. linux下 redis 启动

    启动文件 startredis.sh  : nohup /data/redis/bin/redis-server /data/redis/etc/redis.conf & 关闭文件 stopr ...

  5. 理解ros话题--6

    理解ROS话题(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程介绍ROS话题(topics)以及如何使用ro ...

  6. JAVA实现随机无重复数字功能

    本文给大家介绍如何在JAVA中实现随机无重复数字的功能.如果您是初学者的话,有必要看一看这篇文章,因为这个功能一般会在面试中遇到.包括我本人在招聘人员的时候也喜欢拿这个问题去问别人,主要看一看考虑问题 ...

  7. YARN 中的应用程序提交

    YARN 中的应用程序提交 本节讨论在应用程序提交到 YARN 集群时,ResourceManager.ApplicationMaster.NodeManagers 和容器如何相互交互.下图显示了一个 ...

  8. Python 入门(一)定义字符串+raw字符串与多行字符串

    定义字符串 前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" " ...

  9. NPOI抓取WPS表格保存的EXCEL文件

    其实是可以抓取的,唯一不同就是Sheet的位置前进了一位.     var sheet1 = (HSSFSheet)hssfworkbook.GetSheetAt(1);     来自为知笔记(Wiz ...

  10. long()

    long() 用于将一个对象转换为长整数 In [35]: long(') # 将纯数字的字符串转换为长整数 Out[35]: 123L In [36]: long(12.3) # 将浮点数转换为长整 ...