Guava User Guide

wiki

基本工具类


使用和避免NULL

使用Optional

前置条件

使用前置条件来断言数据

对象常用方法

常见方法

equals

使用Objects.equal可以避免NPE。如下所示:

1
2
3
4
Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true

在JDK 7中有提供等价方法

compare/compareTo

在实现Comparable接口时,通常的做法是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person implements Comparable<Person> {
private String lastName;
private String firstName;
private int zipCode;

public int compareTo(Person other) {
int cmp = lastName.compareTo(other.lastName);
if (cmp != 0) {
return cmp;
}
cmp = firstName.compareTo(other.firstName);
if (cmp != 0) {
return cmp;
}
return Integer.compare(zipCode, other.zipCode);
}
}

有了ComparsionChain之后,可以这样实现

1
2
3
4
5
6
7
public int compareTo(Foo that) {
return ComparisonChain.start()
.compare(this.aString, that.aString)
.compare(this.anInt, that.anInt)
.compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
.result();
}

Ordering

排序
Ordering支持链式调用。例如,我们想要以下类的一个包含null值的sortedBy字段的比较器。

1
2
3
4
class Foo {
@Nullable String sortedBy;
int notSortedBy;
}

可以这么写:

1
2
3
4
5
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() {
public String apply(Foo foo) {
return foo.sortedBy;
}
});

该Ordering需要从右往左读,先读取sortedBy的值,再null置顶,再按照String类型的自然顺序排序。

异常处理工具类

Throwables

用于过滤异常或者得到异常链等

集合(Collections)


不可变更集合

ImmutableCollections

新的集合类型

New Collection Types

多重集

相同的元素可以出现多次

  • 当做集合时,更像ArrayList
  • 附加的查询操作,更像Map<E, Integer>

多重关连数组(Multimap)

BiMap

一般,我们为了保持valuekey的映射,会如下设置:

1
2
3
4
5
6
7
Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();

nameToId.put("Bob", 42);
idToName.put(42, "Bob");
// what happens if "Bob" or 42 are already present?
// weird bugs can arise if we forget to keep these in sync...

BiMap<K, V>是一个保持以下特性的Map<K, V>:

  • 可以通过inverse()来获取BiMap<K, V>的倒置视图
  • 保证了value是唯一的

支持行、列,如:

1
2
3
4
5
6
7
Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();
weightedGraph.put(v1, v2, 4);
weightedGraph.put(v1, v3, 20);
weightedGraph.put(v2, v3, 5);

weightedGraph.row(v1); // returns a Map mapping v2 to 4, v3 to 20
weightedGraph.column(v3); // returns a Map mapping v1 to 20, v2 to 5

ClassToInstanceMap

RangeSet

描述一个不相连的,非空的range的集合。连接的range之间会合并,空的range会被忽略。

1
2
3
4
5
6
RangeSet<Integer> rangeSet = TreeRangeSet.create();
rangeSet.add(Range.closed(1, 10)); // {[1, 10]}
rangeSet.add(Range.closedOpen(11, 15)); // disconnected range: {[1, 10], [11, 15)}
rangeSet.add(Range.closedOpen(15, 20)); // connected range; {[1, 10], [11, 20)}
rangeSet.add(Range.openClosed(0, 0)); // empty range; {[1, 10], [11, 20)}
rangeSet.remove(Range.open(5, 10)); // splits [1, 10]; {[1, 5], [10, 10], [11, 20)}

RangeMap

集合工具类

CollectionUtilities

  • 静态构造器
  • Iterables
  • Lists: 分段,逆置
  • Sets: 交、并、差等
  • Maps:

    • Maps.uniqueIndex(Iterable, Function生成唯一键可以索引的Map。

      1
      2
      3
      4
      5
      ImmutableMap<Integer, String> stringsByIndex = Maps.uniqueIndex(strings, new Function<String, Integer> () {
      public Integer apply(String string) {
      return string.length();
      }
      });
      • BiMap
      • Multisets
      • Multimaps
      • Tables: customTabletranspose

扩展工具类

Extension Utilities

Caches

Functional idioms

Guava提供两个基本的“函数式”接口:

  • Function<A, B>
  • Predicate<T>

TO BE CONT.