Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。使用guava可以让你的java代码更加的规范。具体使用:
如上图所示,如果报错,可以在maven中使用更早版本的guava包(错误意思是使用了1.8版本编译但是不能用其他版本运行)
一、基本使用
1、使用和避免null
Optional.of(T):创建指定引用的Optional实例,若引用为null则快速失败;
Optional.absent():创建引用缺失的Optional实例;
Optional.fromNullable(T):创建指定引用的Optional实例,若引用为null则表示缺失;
boolean isPresent():如果Optional包含非null的引用(引用存在),返回true;
T get():返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException;
@Test
public void optionalTest(){
Person p1 = new Person("周杰伦",37);
Person p2 = null;
Optional<Person> optPer1 = Optional.of(p1);
//Optional<Person> optPer2 = Optional.of(p2);//报空指针异常
Optional<Person> optPer2 = Optional.fromNullable(p2);//可以放空值
System.out.println(optPer1.get().getName());
//System.out.println(optPer2.get());//如果p2是空,使用formNullable,调用get则报java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
System.out.println(optPer1.isPresent());//有值返回true
}
2、前置条件(让方法调用的前置条件判断更简单)
checkArgument(i >= 0, “Argument was %s but expected nonnegative”, i);
checkNotNull(T)等方法;
@Test
public void testPreconditions(){
// 不会输出任何代码
String str = "abc";
Preconditions.checkNotNull(str,"str 为 null");
//报java.lang.NullPointerException:constantName 为 null
String constantName = null;
Preconditions.checkNotNull(constantName,"constantName 为 null");
}
二、集合的使用
FluentIterable 是guava集合类中常用的一个类,主要用于过滤、转换集合中的数据;FluentIterable 是一个抽象类,实现了Iterable接口,大多数方法都返回FluentIterable对象,这也是guava的思想之一。
return FluentIterable.from(results).transform(toPlanMinInvestAmountDTO()).toList();
private Function<Object[], PlanMinInvestAmountDTO> toPlanMinInvestAmountDTO() {
return new Function<Object[], PlanMinInvestAmountDTO>() {
@Override
public PlanMinInvestAmountDTO apply(Object[] input) {
return aPlanMinInvestAmountDTO()
.withMinInvestAmount((BigDecimal) input[0])
.withPlanType((String) input[1])
.build();
}
};
}
//测试过滤掉50岁以上的人
@Test
public void testFilter(){
Person p1 = new Person("周杰伦",37);
Person p2 = new Person("王力宏",43);
Person p3 = new Person("李易峰",23);
Person p4 = new Person("许镜清",70);
Person p5 = new Person("贝多芬",72);
List<Person> persons = asList(p1, p2, p3,p4,p5);
List<Person> persons1 = from(persons).filter(getPersomAgeUnder30()).toList();
for(Person p:persons1){
System.out.println(p.getName()+" "+p.getAge());
}
}
//过滤大于50岁的,返回true则获取该条数据到返回list中
private Predicate<Person> getPersomAgeUnder30() {
return new Predicate<Person>() {
public boolean apply(Person input) {
return input.age < 50;
}
};
}
三、函数式编程
过度使用Guava函数式编程会导致冗长、混乱、可读性差而且低效的代码。如上方法toPlanMinInvestAmountDTO
四、字符串处理:分割,连接
@Test
public void stringGuava(){
//连接器
Joiner joiner = Joiner.on(";").skipNulls();//如果不加skipNulls,参数中有null将会报空指针
System.out.println(joiner.join("Harry", null, "Ron", "Hermione"));//输出Harry;Ron;Hermione
Joiner joiner2 = Joiner.on(";").useForNull("****");//代替null值
System.out.println(joiner2.join("Harry", null, "Ron", "Hermione"));//输出Harry;****;Ron;Hermione
//拆分器
String str = ",a,,b,";
String[] strArr = str.split(",");
System.out.println(strArr.length);//输出4
for(String s:strArr){
System.out.println(s==null? "NULL":s);//输出"",a,"",b,只有尾部的空字符串被忽略
}
System.out.println("----------");
//omitEmptyStrings():从结果中自动忽略空字符串
//trimResults() :移除结果字符串的前导空白和尾部空白
//trimResults(CharMatcher):给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
Iterable<String> strs = Splitter.on(",").trimResults().omitEmptyStrings().split(str);
for(String s:strs){
System.out.println(s);//只输出a,b
}
//如果你想要拆分器返回List,只要使用Lists.newArrayList(splitter.split(string))或类似方法
}