guava实用小方法

一、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提供了一些比较方便的数学运算的方法,防止自己写一些复杂的运算出现错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值