Java中Guava工具类库(一、Optional,Preconditions,Ordering)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LS7011846/article/details/82262714

前言

    Guava读作“瓜娃”,番石榴的意思。它是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供包括用于集合,缓存,反射,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。

    使用Guava可以使自己的代码可读性增加、执行效率增加,最重要的是简单好用,让很多代码简洁化,在编写代码的过程中,更专注于业务和性能。

Maven

    首先我们在项目中若想使用Guava,需要导入包,其中Maven的依赖如下

<dependency> 
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
</dependency> 

使用

Optional——与对象空值打交道

    Optional作为其中较为多用的工具类,其主要用途是来处理对象的Null值,在日常开发中我们经常会用到参数校验的工作。其部分使用如下。

public class GuavaOptional {
    public static void main(String[] args) {
        String str1 = new String("Guava");
        String str2 = null;
        String getstr = Optional.ofNullable(str2).orElse(str1); //如果str1为空则将字符串赋值为str1
        System.out.println(getstr);//输出为Guava
        System.out.println(Optional.of(str1).isPresent());//输出为true
        System.out.println(Optional.ofNullable(str2).isPresent());//输出为false

        Optional<String> opstr3 = Optional.ofNullable(str2);
        String str3 = opstr3.orElse("空");//这里和上面的均多用于容错处理,在对空对象处理时使用,建议使用上面的方法比较简洁。
        System.out.println(str3);
    }
}

Preconditions——方法逻辑执行前的参数校验

    Preconditions作为一个方法参数校验的工具类,在日常开发过程中用处也十分广泛,主要用于在调用方法之前的校验环节,多用于开发阶段的自我测试。

public class GuavaPreconditions {
    public static void main(String[] args) throws Exception {
        getPersonByPrecondition(8, "peida");
        try {
            getPersonByPrecondition(-9, "peida");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        try {
            getPersonByPrecondition(8, "");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        try {
            getPersonByPrecondition(8, null);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static void getPersonByPrecondition(int age, String neme) throws Exception {
        Preconditions.checkNotNull(neme, "neme为null");
        Preconditions.checkArgument(neme.length() > 0, "neme为\'\'");
        Preconditions.checkArgument(age > 0, "age 必须大于0");
        System.out.println("a person age:" + age + ",neme:" + neme);
    }
}

控制台输出:
a person age:8,neme:peida
age 必须大于0
neme为''
neme为null

    如上所示,getPersonByPrecondition作为主体方法,可以在进入业务逻辑前对参数进行校验并抛出异常。

Ordering——对数组容器的排序工具

    Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在容器的比较、排序等操作中。本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器。示例如下:

public class GuavaOrdering {
    public static void main(String[] args){
        List<String> list = Lists.newArrayList();
        list.add("peida");
        list.add("jerry");
        list.add("harry");
        list.add("eva");
        list.add("jhon");
        list.add("neron");

        System.out.println("list序列:"+ list);

        Ordering<String> naturalOrdering = Ordering.natural();
        Ordering<Object> usingToStringOrdering = Ordering.usingToString();
        Ordering<Object> arbitraryOrdering = Ordering.arbitrary();

        System.out.println("使用类似comparable排序:"+ naturalOrdering.sortedCopy(list));
        System.out.println("使用tostring排序:"+ usingToStringOrdering.sortedCopy(list));
        System.out.println("任意排序:"+ arbitraryOrdering.sortedCopy(list));

        List<Integer> numbers = new ArrayList<Integer>();
        numbers.add(new Integer(5));
        numbers.add(new Integer(2));
        numbers.add(new Integer(15));
        numbers.add(new Integer(51));
        numbers.add(new Integer(53));
        numbers.add(new Integer(35));
        numbers.add(new Integer(45));
        numbers.add(new Integer(32));
        numbers.add(new Integer(43));
        numbers.add(new Integer(16));

        Ordering ordering = Ordering.natural();
        System.out.println("输入时的顺序 ");
        System.out.println(numbers);

        Collections.sort(numbers,ordering );
        System.out.println("排序之后 ");
        System.out.println(numbers);

        System.out.println("======================");
        System.out.println("数组是否被排序 " + ordering.isOrdered(numbers));
        System.out.println("最小值: " + ordering.min(numbers));
        System.out.println("最大值: " + ordering.max(numbers));

        Collections.sort(numbers,ordering.reverse());
        System.out.println("翻转 " + numbers);

        numbers.add(null);
        System.out.println("加入空对象后");
        System.out.println(numbers);

        Collections.sort(numbers,ordering.nullsFirst());
        System.out.println("将空对象放在首位 ");
        System.out.println(numbers);
        System.out.println("======================");
    }
}

未完待续。。。接下来准备的是字符串,集合以及缓存,反射,支持原语,并发性等的探索。

猜你喜欢

转载自blog.csdn.net/LS7011846/article/details/82262714