翻译自guava wiki以及api docs
来自谷歌的Java工具类库,支持Java 6+。文章中还专门强调:每种工具真的被谷歌的工程师每天都使用。
需要JDK 1.6 或更高(自从 12.0)
Guava(番石榴)的一些最流行最强大的功能
- 基本工具集:让使用Java语言更令人愉快。
- 集合类:Guava对JDK集合的扩展。这有一些Guava最成熟最流行的部分。
- 缓存:本地缓存,表现良好,并支持各种各样的失效行为。
- 实用的习惯用语:用的很少,Guava的习惯用语可以极大的简化代码。
- 字符串:一些极其有用的字符串工具类:分割、连接、填充等等。
- 原始类:在原始类型操作,比如
int
和char
,没有被JDK提供的,包括一些类型的无符号的变量。 - 排序:Guava用来处理
Comparable
类型排序的强大API,包括连续和离散类型。 - I/O:简化IO操作,尤其是Java 5 and 6的整个IO流和文件。
- 哈希散列:比
Object.hashCode()
提供的hash更复杂的工具,包括了Bloom过滤器。 - 事件总线:发布-订阅模式的组件通信,但组件不需要显式地注册到其他组件中。
- 数学:最佳的,完成经过测试的数学工具,没有被JDK提供的。
- 反射:Guava关于Java的反射的工具类。
这些工具类可以提高编程速度,更好的可读性,也更安全,让你专心于业务的处理。
maven依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
一、基本工具集
1.1 使用/避免null
"I call it my billion-dollar mistake." - Sir C. A. R. Hoare, on his invention of the null reference
粗心的使用null
会引起多种多样的bugs。本工具集中大约95%的集合操作不支持任何的null
值在里面。
然后是一大堆枯燥的段落。
便捷方法
Strings
类中提供了一些处理可能是null字符串值的方法。特别的提供了恰当的命名:
emptyToNull(String)
isNullOrEmpty(String)
nullToEmpty(String)
1.2 先决条件
Guava提供了一系列先决条件检查工具。我们强烈推荐使用静态引入。
例如:
Preconditions.checkArgument(boolean)
用法:checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
checkNotNull(T)
验证某个对象不是null
,如果是null
会抛出NullPointerException
checkPositionIndex(int index, int size)
检查index是不是在list,string,或者指定size的数组中。如果不在抛出IndexOutOfBoundsException
1.3 排序
Ordering
类是guava的“流式(fluent)”比较器类,可以被用作构建复杂的比较器并且将它们应用到集合对象上。
作为它的核心,一个Ordering
实例本质上就是一个特殊的Comparator
实例。
-
natural()
在Comparable 类型上使用自然排序。 -
usingToString()
通过其字符串表示的对象按字典序比较
将一个先前存在的Comparator
放进Ordering
是很简单的:
Ordering.from(Comparator)
但是更常用的方法是创建一个自定义的Ordering
直接继承它:
Ordering<String> byLengthOrdering = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
-
reverse()
返回一个相反的排序 -
nullsFirst()
返回一个Ordering
null元素会在最前面。 -
isOrdered(Iterable)
测试Iterable
是否是非递减的排序顺序
1.4 对象方法
1.4.1 equals
当你的对象可能是null
时使用Object.equals
方法必须去做检查。使用Objects.equal
不必担心NullPointerException
Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true
1.4.2 hashCode
生成hashCode
Objects.hashCode(Object...)
1.4.3 compare/compareTo
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();
}
二、集合工具类
2.1 不可变集和
首先是一个例子
public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
"red",
"orange",
"yellow",
"green",
"blue",
"purple");
class Foo {
final ImmutableSet<Bar> bars;
Foo(Set<Bar> bars) {
this.bars = ImmutableSet.copyOf(bars); // defensive copy!
}
}
一个ImmutableXXX
集和可以通过几种不同的方式被创建:
- 使用
copyOf
方法:ImmutableSet.copyOf(set)
- 使用
of
方法:ImmutableSet.of("a", "b", "c")
或者ImmutableMap.of("a", 1, "b", 2)
- 使用一个
Builder
:
public static final ImmutableSet<Color> GOOGLE_COLORS =
ImmutableSet.<Color>builder()
.addAll(WEBSAFE_COLORS)
.add(new Color(0, 191, 255))
.build();
除了排序的集和:顺序是在构造时保存的,例如:
ImmutableSet.of("a", "b", "c", "a", "d", "b")
将会按照"a", "b", "c", "d"的顺序遍历。
所有的不可变集和都提供一个ImmutableList
视图,通过asList()
方法获得,例如:
sortedSet.asList().get(k)
2.2 新集合类型
这部分我看就算了,还是用JDK的吧。
2.3 集合工具类
2.3.1 静态构造器
在JDK 7之前,创建一个新集合需要以下
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>();
Guava提供了静态方法来创建集合:
List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap();
通过工厂模式我们可以很方便的初始化集合:
Set<Type> copySet = Sets.newHashSet(elements);
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");
还可以初始化集合的大小:
List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);
Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100);
2.3.2 Iterables
在任何可能的时候,Guava更倾向于提供一些工具类接受一个Iterable
而不是一个Collection
。