一、Procondition
Procondition有点快速失败的意思,就是提前对参数进行判断约束,有异常提前抛出来。
在实际业务中,从某个bean里拿出一个为空的属性作为参数,执行了很多代码,在后面某个时机程序崩掉,使用Procondition可以在拿出可能为空的参数时进行前置判断,避免执行更多的代码,有利于定位错误信息,使程序更加健壮。
1.checkArgument
checkArgument比较常用,采用printf的格式约束参数。
int i=0;
checkArgument(i!=0,"分母不能等于0");
int j = 9/i;
当i=0时,不会执行到int j = 9/i;而是在checkArgument(i!=0,”分母不能等于0”);时就已经抛出java.lang.IllegalArgumentException的异常。
2.checkNotNull
checkNotNull也比较常用
String str = null;
checkNotNull(str);
System.out.println(str.length());
这里约定了str不能为空,否则checkNotNull会抛出空指针异常,不会到调用str的lenght方法才抛出异常。
还有checkState等方法也比较常用。
二、Objects
public class Object {
public static void main(String[] args) {
class Inner {
public Inner(String _a) {
this.a = _a;
}
String a;
String b;
}
Inner inner = new Inner("test1");
Inner inner1 = new Inner("S");
System.out.println(com.google.common.base.Objects.equal(inner.b,inner1.b));
System.out.println(Objects.equals(inner.b,inner1.b));
//System.out.println(inner.b.equals(inner1.b));//抛空指针
}
}
如果当我们比较两个实例对象的字符串属性为空时,通过string的equals方法会产生空指针,这里可以使用guava的Objects.equal方法代替,但是如果都为空会返回true。jdk7也有一种相应的方法Objects.equals很类似。
三、Comparator
当我们要比较两个或者多个对象实例的时候,有两种方式,一个是写一个继承Comparator的比价类,泛型为实例对象的类型,在compare方法中定义比较逻辑
public class ComapreUser implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
int cmp = o1.getLastName().compareTo(o2.getLastName());
if (cmp != 0) {
return cmp;
}
cmp = o1.getFirstName().compareTo(o2.getFirstName());
if (cmp != 0) {
return cmp;
}
return Integer.compare(o1.getId(), o2.getId());
}
}
先按照lastname比较,如果相同,按照firstname比较,如果相同按照id比较。
还有就是在要比较的实例对象的bean中继承Comparable接口,在类里面写一个比较方法
@Override
public int compareTo(User o) {
int cmp = this.lastName.compareTo(o.lastName);
if (cmp != 0) {
return cmp;
}
cmp = this.firstName.compareTo(o.firstName);
if (cmp != 0) {
return cmp;
}
return Integer.compare(this.id, o.id);
}
用法是:
User user1 = new User(1,"z","b");
User user2 = new User(2,"d","s");
User user3 = new User(3,"b","v");
List<User> list = Lists.newArrayList(user1,user2,user3);
//使用内部比较器,需要user实现Comparable接口
Collections.sort(list);
但是这样写方法有些臃肿,guava提供了流畅风格的比较方法:
@Override
public int compareTo(User o) {
return ComparisonChain.start()
.compare(this.lastName, o.lastName)
.compare(this.firstName, o.firstName)
.compare(this.id, o.id)
.result();
}
使用ComparisonChain的方式链式的定义比较顺序。写法简单易懂。
四、 String相关
1、split
jdk的split方法有一个奇怪的地方:
String str = ",a,,b,";
List<String> chars = Lists.newArrayList(str.split(","));
输出的结果是:[, a, , b]
它把最后一个,的后面的空格忽略了,有时候业务逻辑可能不想忽略,这时候就用guava的方法。
List<String> chars2 = Lists.newArrayList(Splitter.on(",").trimResults().split(str));
输出的结果是:[, a, , b, ]
2、CharMatcher
CharMatcher提供了一些比较好用的string截取去除等功能的方法:
String str = " gfDFDF3h 4DFh5 SDF hg3hFDr 4fbSDFDej f48SDFhfj hfkjhsdSD4i ";
//移除数字
System.out.println(CharMatcher.DIGIT.removeFrom(str));
//只保留数字
System.out.println(CharMatcher.DIGIT.retainFrom(str));
//去除两端空格,中间连续空格替换为单个空格
System.out.println(CharMatcher.WHITESPACE.trimAndCollapseFrom(str, ' '));
//用*替换所有数字
System.out.println(CharMatcher.JAVA_DIGIT.replaceFrom(str, "*"));
//只保留小写字母和数字
System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(str));
五、 Math类扩展
//取幂
System.out.println(IntMath.pow(4,3));
//阶乘
System.out.println(IntMath.factorial(3));
//最大公约数
System.out.println(IntMath.gcd(6,15));
guava提供了一些比较方便的数学运算的方法,防止自己写一些复杂的运算出现错误。