基本工具类
使用和避免NULL
前置条件
对象常用方法
equals
使用Objects.equal
可以避免NPE。如下所示:1
2
3
4Objects.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
17class 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
7public 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
4class Foo {
String sortedBy;
int notSortedBy;
}
可以这么写:1
2
3
4
5Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() {
public String apply(Foo foo) {
return foo.sortedBy;
}
});
该Ordering需要从右往左读,先读取sortedBy的值,再null置顶,再按照String
类型的自然顺序排序。
异常处理工具类
用于过滤异常或者得到异常链等
集合(Collections)
不可变更集合
新的集合类型
多重集
相同的元素可以出现多次
- 当做集合时,更像
ArrayList
- 附加的查询操作,更像
Map<E, Integer>
多重关连数组(Multimap)
BiMap
一般,我们为了保持value
到key
的映射,会如下设置:1
2
3
4
5
6
7Map<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
7Table<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 | RangeSet<Integer> rangeSet = TreeRangeSet.create(); |
RangeMap
集合工具类
- 静态构造器
- Iterables
- Lists: 分段,逆置
- Sets: 交、并、差等
Maps:
Maps.uniqueIndex(Iterable, Function
生成唯一键可以索引的Map。1
2
3
4
5ImmutableMap<Integer, String> stringsByIndex = Maps.uniqueIndex(strings, new Function<String, Integer> () {
public Integer apply(String string) {
return string.length();
}
});- BiMap
- Multisets
- Multimaps
- Tables:
customTable
,transpose
扩展工具类
Caches
Functional idioms
Guava提供两个基本的“函数式”接口:
Function<A, B>
Predicate<T>
TO BE CONT.