前言
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("======================");
}
}
未完待续。。。接下来准备的是字符串,集合以及缓存,反射,支持原语,并发性等的探索。