Guava学习笔记(一)

Guava学习笔记(一)

本节主要包含的内容为基础工具库的使用。

为什么学习Guava?

Guava是Google的一套基础类库,学习它除了提高开发效率外,其它就是提升逼格了。

Using/avoiding null

在Guava中有一个Optional抽象类,它和Jdk提供的功能差不多,用来避免使用null对象,jdk8中的Optional是不是从Guava抄来的?如果使用8以下版本的jdk,Guava倒也是一个选择。

-w409

上述图列出了Guava Optional class中包含的方法,大致上也分为了3类和jdk的一样,这里不做过多的赘述。

Preconditions

这是Guava提供的一组类似断言的前置检查工具方法。

这些方法Guava强烈建议我们静态倒入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import static com.google.common.base.Preconditions.*;

private int i = 5;
private int j = 10;
private String z = null;

@Test
public void test() {
checkArgument(i > j, "message %s", "bad");

checkNotNull(z);

checkState(i > j);
//这个会抛出异常,不包含5
checkElementIndex(5, 5);
//这个没有问题,包含5,这也是和上面的区别
checkPositionIndex(5, 5);

checkPositionIndexes(-1, 3, 5);
}

下图列出了方法名说明等,我把他们分为2类,一个是对值的校验,另一个是对数组位置的校验。

-w640

Ordering

Ordering本身实现了比较器接口,所以可以结合Java的Collections类进行快速排序。主要使用场景用来快速构建较为复杂的排序逻辑,在Java8之后Comparator类新增了一些方法,也可以支持构建多级排序规则。

1
public abstract class Ordering<T> implements Comparator<T>

创建

  1. natural()

    对可排序的类型做自然排序

    1
    2
    List<Integer> list = Arrays.asList(1, 5, 3, 8, 2);
    Collections.sort(list, Ordering.natural());
  1. usingToString()

    按对象的字符串形式进行字典排序

  2. Ordering.from(Comparator)

    使用预先的比较器进行构建

比较器链

这个才是Ordering比较强的地方,可以由给定的比较器组合出其它的比较器,,可以做到多字段排序,更多详细的示例在参考中有描述

-w710

应用

Ordering同时也提供了一组方法,可以用来直接操作集合,直接操作集合。

-w714

对比Java8的Comparator

我觉得Guava Ordering最强的地方就是链式的组合多个比较器,从而可以做到多字段的比较,在Java8的Comparator对象中新增了

1
default Comparator<T> thenComparing(Comparator<? super T> other)

同样也可以实现用多个字段比较。

Object methods

Object的方法主要有4个

equals

用来判断2个对象是否相等,需要注意的是jdk util包中也有一个Objects对象,里面的euqals方法和这个是等效的

1
Objects.equal(null, "a"); // returns false

hashCode

Guava的Objects.hashCode(Object...)提供了一个比较实用的为一组对象生成HashCode

toString

也是一个比较好用的方法

1
2
System.out.println(MoreObjects.toStringHelper(this).add("i", i).toString());
//输出 GuavaTest{i=5}

compare/compareTo

这个也挺有意思的,使用ComparisonChain对象创建一个多级比较,更多的介绍看文档

Throwables

Throwables类的使用场景我还没想好,我觉得并不是一个必须使用的,文档上给了这么个示例

1
2
3
4
5
6
7
8
9
try {
someMethodThatCouldThrowAnything();
} catch (IKnowWhatToDoWithThisException e) {
handle(e); //1
} catch (Throwable t) {
Throwables.propagateIfInstanceOf(t, IOException.class); //2
Throwables.propagateIfInstanceOf(t, SQLException.class); //3
throw Throwables.propagate(t); //4
}

上述代码中,标记1表示捕捉并处理了我们已知的异常,2和3表示如果捕捉的异常是IOException和SQLException则抛出这两个异常,4再抛出异常t

这一块我也不是很理解

参考

1. Guava Ordering的使用
2. Ordering与Java8排序比较

# guava

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×