• Guava 2:Basic utilities基本工具


    一、引子

    Guava的经典很大一部分原因来源于对于基础工具类的封装,使用这些类能够让我们的代码更加优雅且完善,这些类大部分都在com.google.common.base包下。

    注:JDK有很多借鉴guava的地方,本文只讲解guava,如果jdk中有类似的实现,不必疑虑。

    二、基本工具

    按照官网介绍,Guava base包下有一些经典工具,如下:

    2.1 Optional<T>

    1.作用

    在构造对象的时候就明确申明该对象是否可能为null,快速失败拒绝null值,可以避免空指针异常。

    2.简单使用

     1 /**
     2  * @Description Optional:一个指向值对象引用的对象实例,使得构造对象时就明确申明是否支持null
     3  * @author denny
     4  * @date 2018/7/24 下午2:23
     5  */
     6 public class OptionalTest {
     7     public static void main(String[] args) {
     8         Integer a = null;
     9         Integer b = 1;
    10         // 支持null、非null
    11         Optional<Integer> optionalA1 = Optional.fromNullable(a);
    12         Optional<Integer> optionalA2 = Optional.fromNullable(b);
    13         // 不支持null,参数为null报错
    14         Optional<Integer> optionalB = Optional.of(b);
    15         // 不包含引用对象的实例()
    16         Optional<Integer> optionalC = Optional.absent();
    17 
    18         // 不存在实例,不进入
    19         if(optionalA1.isPresent()){
    20             System.out.println(" A1 get="+optionalA1.get());
    21         }
    22         // 存在实例,进入
    23         if(optionalA2.isPresent()){
    24             System.out.println(" A2 get="+optionalA2.get());
    25         }
    26         // 存在实例,进入
    27         if(optionalB.isPresent()){
    28             System.out.println(" B get="+optionalB.get());
    29         }
    30         // 不存在实例,不进入
    31         if(optionalC.isPresent()){
    32             System.out.println(" C get="+optionalC.get());
    33         }
    34 
    35     }
    36 }

    结果如下:

     A2 get=1
     B get=1

    2.2 Preconditions

     1.作用

    前置条件校验,让方法中的条件检查更简单。

    2.简单使用

     1 /**
     2  * @Description 前置条件校验
     3  * @author denny
     4  * @date 2018/7/24 下午3:14
     5  */
     6 public class PreconditionsTest {
     7     public static void main(String[] args) {
     8 
     9         /** 1.空指针校验 */
    10         Integer a = null;
    11         // 直接抛出空指针异常
    12         Preconditions.checkNotNull(a);
    13         // 抛出指定错误消息的空指针异常
    14         Preconditions.checkNotNull(a,"a is null!");
    15         // 抛出指定错误消息(指定参数替换掉%s)的空指针异常
    16         Preconditions.checkNotNull(a,"a is null ,a=%s",a);
    17 
    18         /** 2.方法入参校验 */
    19         // 方法入参校验:校验第一参是否true
    20         Preconditions.checkArgument(a!=null && a>=0,"参数a不满足条件! a=%s",a);
    21 
    22         /** 3.检查对象的状态 */
    23         // 模拟:订单号作为方法入参,修改订单状态为已完成。
    24         Order order = Order.builder().id(1).build();
    25         // 状态校验,非入参校验
    26         Preconditions.checkState(order.getState()>0,"订单状态非法! status=%s",order.getState());
    27 
    28         /** 4.下标越界校验 */
    29         List list = Lists.newArrayList(1,2,3);
    30         //Preconditions.checkElementIndex(5,list.size(),"下标非法!");
    31         
    32         /** 5.下标越界、start<end 校验 */
    33         Preconditions.checkPositionIndexes(0,5,list.size());
    34     }
    35 }

    2.3 Objects(JDK7以上直接使用java.util.Objects)

     1.作用

    常见Object方法,简化Object方法实现,如hashCode()和toString()。

    2.简单使用

    4个典型方法:

    equal、hashcode、toString、compare/compareTo

     1 /**
     2  * @Description 简化对象的一些方法
     3  * @author denny
     4  * @date 2018/7/24 下午4:08
     5  */
     6 public class ObjectsTest {
     7     public static void main(String[] args) {
     8         /** 1.equals */
     9         //false
    10         System.out.println(Objects.equal("a",null));
    11         System.out.println(Objects.equal("a","b"));
    12         // true
    13         System.out.println(Objects.equal("a","a"));
    14         System.out.println(Objects.equal(null,null));
    15 
    16         /** 2.hashCode */
    17         Order order1 = Order.builder().id(1).state(2).build();
    18         Order order2 = Order.builder().id(2).state(1).build();
    19         System.out.println(Objects.hashCode(order1,order2));
    20 
    21         /** 2.toString */
    22         String str = MoreObjects.toStringHelper(order1).add("x",1).toString();
    23         System.out.println(str);
    24 
    25         /** 2.compare/compareTo */
    26         // 这里比较订单大小,比较顺序:id,状态,即先比较ID再比较状态,有一个不相等就立即返回结果
    27         int result = ComparisonChain.start()
    28             .compare(order1.getId(),order2.getId())
    29             .compare(order1.getState(),order2.getState())
    30             .result();
    31         System.out.println(result);
    32     }
    33 }

    打印结果:

    1 false
    2 false
    3 true
    4 true
    5 114363
    6 Order{x=1}
    7 -1

    2.4 Ordering<T>(JDK8建议直接使用Stream,Comparator)

     1.作用

    排序,”流式风格比较器”。支持多重排序,并使用到集合中。这个类不在base包下,在collect包下.可能考虑到集合中元素排序吧...

    2.简单使用

    reverse() :获取语义相反的排序器
    nullsFirst():null值排到最前面。
    nullsLast():null值排到最后面。
    compound(Comparator):合成另一个比较器,以处理当前排序器中的相等情况。
    lexicographical():基于处理类型T的排序器,返回该类型的可迭代对象Iterable<T>的排序器。
    onResultOf(Function):对集合中元素调用Function,再按返回值用当前排序器排序。

     1 package guava.base;
     2 
     3 import com.google.common.base.Function;
     4 import com.google.common.collect.Lists;
     5 import com.google.common.collect.Ordering;
     6 import guava.base.domain.Order;
     7 
     8 import java.util.List;
     9 
    10 /**
    11  * @Description 排序
    12  * @author denny
    13  * @date 2018/7/24 下午6:01
    14  */
    15 public class OrderingTest {
    16     public static void main(String[] args) {
    17         /**自然排序: 数字升序,时间升序*/
    18         // 简单数据排序
    19         Ordering<Integer> integerOrdering = Ordering.natural().nullsFirst();
    20         List<Integer> list = Lists.newArrayList(1,3,null,5,4,2);
    21         // 自然排序,空前置
    22         System.out.println("1.自然排序:"+integerOrdering.sortedCopy(list));
    23         System.out.println("2.自然反转排序:"+integerOrdering.reverse().sortedCopy(list));
    24 
    25         // 根据apply返回值排序
    26         Ordering<Order> orderOrdering = Ordering.natural().onResultOf(new Function<Order, Integer>() {
    27             public Integer apply(Order order){
    28                 /* 订单ID自然排序 */
    29                 return order.getId();
    30             }
    31         });
    32         List<Order> orders = Lists.newArrayList(new Order(1,0),new Order(3,1),new Order(2,2));
    33         System.out.println("3.根据订单ID自然排序:"+orderOrdering.sortedCopy(orders));
    34         System.out.println("4.根据订单ID自然排序,求最大值:"+orderOrdering.max(orders));
    35         System.out.println("5.根据订单ID自然排序,求最小值:"+orderOrdering.min(orders));
    36         System.out.println("6.求ID最小的k个元素:"+orderOrdering.leastOf(orders,2));
    37         System.out.println("7.求ID最大的k个元素:"+orderOrdering.greatestOf(orders,2));
    38     }
    39 }

    结果如下:

    1.自然排序:[null, 1, 2, 3, 4, 5]
    2.自然反转排序:[5, 4, 3, 2, 1, null]
    3.根据订单ID自然排序:[Order(id=1, state=0), Order(id=2, state=2), Order(id=3, state=1)]
    4.根据订单ID自然排序,求最大值:Order(id=3, state=1)
    5.根据订单ID自然排序,求最小值:Order(id=1, state=0)
    6.求ID最小的k个元素:[Order(id=1, state=0), Order(id=2, state=2)]
    7.求ID最大的k个元素:[Order(id=3, state=1), Order(id=2, state=2)]

    2.5 Throwables(不推荐使用)

     1.作用

    异常支持,简化了异常和错误的传播与检查。

    2.简单使用

    目前JDK7已经是比较老的版本了,JDK7自带多重捕获,7以及以上都不推荐使用Throwables,这里就不写使用了。

     三、总结

    guava虽然很经典,但是因为JDK一直在迭代完善,当JDK中有的东西时,建议就不要用guava了。基础工具中,Optional和Preconditions还是可以用用,其它的也就那样了,各位自己看着用吧,当然作为基础工具,想要看guava源码还是有必要了解下知道是干嘛的。

    ==参考==

    Guava Github User Guide 

  • 相关阅读:
    网站设计的65条原则
    汇编指令: VERW、WAIT、WBINVD、WRSHR、WRMSR、XADD、XBTS、XCHG、
    openssl编程入门(含完整可编译和运行示例)
    揭开Linux的Swap之谜
    成功的 Web 应用系统性能测试
    加密通讯协议SSL编程周立发
    Google Sparse Hash
    测试 Linux 的可靠性
    进程绑定CPU简单应用
    mylarge&mymedium&mysmall&myinnodbheavy4G
  • 原文地址:https://www.cnblogs.com/dennyzhangdd/p/9356416.html
Copyright © 2020-2023  润新知