• Guava增强for循环


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

  • 相关阅读:
    记解决一次“HTTP Error 400. The request URL is invalid”的错误
    微信退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道“或”The request was aborted: Could not create SSL/TLS secure channel“的错误
    aps.net国际化本地资源 .resources”正确嵌入或链接到程序集
    远程链接 aws Windows Server 2016 Base Nano
    linux odbc框架
    linux webservice
    linux 共享内存管理
    linux 广播寻址
    linux curse库
    linux log框架设计
  • 原文地址:https://www.cnblogs.com/Alex--Yang/p/3371282.html
Copyright © 2020-2023  润新知