Google Guava 用户指南

翻译自guava wiki以及api docs

来自谷歌的Java工具类库,支持Java 6+。文章中还专门强调:每种工具真的被谷歌的工程师每天都使用。

需要JDK 1.6 或更高(自从 12.0)

Guava(番石榴)的一些最流行最强大的功能

  • 基本工具集:让使用Java语言更令人愉快。
  • 集合类:Guava对JDK集合的扩展。这有一些Guava最成熟最流行的部分。
  • 缓存:本地缓存,表现良好,并支持各种各样的失效行为。
  • 实用的习惯用语:用的很少,Guava的习惯用语可以极大的简化代码。
  • 字符串:一些极其有用的字符串工具类:分割、连接、填充等等。
  • 原始类:在原始类型操作,比如intchar,没有被JDK提供的,包括一些类型的无符号的变量。
  • 排序:Guava用来处理Comparable类型排序的强大API,包括连续和离散类型。
  • I/O:简化IO操作,尤其是Java 5 and 6的整个IO流和文件。
  • 哈希散列:比Object.hashCode()提供的hash更复杂的工具,包括了Bloom过滤器。
  • 事件总线:发布-订阅模式的组件通信,但组件不需要显式地注册到其他组件中。
  • 数学:最佳的,完成经过测试的数学工具,没有被JDK提供的。
  • 反射:Guava关于Java的反射的工具类。

这些工具类可以提高编程速度,更好的可读性,也更安全,让你专心于业务的处理。

maven依赖:


    com.google.guava
    guava
    19.0

一、基本工具集

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提供了一系列先决条件检查工具。我们强烈推荐使用静态引入。

例如:

  1. Preconditions.checkArgument(boolean) 用法:checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);

  2. checkNotNull(T) 验证某个对象不是null,如果是null会抛出NullPointerException

  3. checkPositionIndex(int index, int size)检查index是不是在list,string,或者指定size的数组中。如果不在抛出IndexOutOfBoundsException

1.3 排序

Ordering类是guava的“流式(fluent)”比较器类,可以被用作构建复杂的比较器并且将它们应用到集合对象上。

作为它的核心,一个Ordering实例本质上就是一个特殊的Comparator实例。

  1. natural()在Comparable 类型上使用自然排序。
  2. usingToString()通过其字符串表示的对象按字典序比较

将一个先前存在的Comparator放进Ordering是很简单的:

Ordering.from(Comparator)

但是更常用的方法是创建一个自定义的Ordering直接继承它:

Ordering byLengthOrdering = new Ordering() {
  public int compare(String left, String right) {
    return Ints.compare(left.length(), right.length());
  }
};
  1. reverse()返回一个相反的排序
  2. nullsFirst()返回一个Orderingnull元素会在最前面。
  3. 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 COLOR_NAMES = ImmutableSet.of(
  "red",
  "orange",
  "yellow",
  "green",
  "blue",
  "purple");

class Foo {
  final ImmutableSet bars;
  Foo(Set 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 GOOGLE_COLORS =
       ImmutableSet.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 list = new ArrayList();

Guava提供了静态方法来创建集合:

List list = Lists.newArrayList();
Map map = Maps.newLinkedHashMap();

通过工厂模式我们可以很方便的初始化集合:

Set copySet = Sets.newHashSet(elements);
List theseElements = Lists.newArrayList("alpha", "beta", "gamma");

还可以初始化集合的大小:

List exactly100 = Lists.newArrayListWithCapacity(100);
List approx100 = Lists.newArrayListWithExpectedSize(100);
Set approx100Set = Sets.newHashSetWithExpectedSize(100);

2.3.2 Iterables

在任何可能的时候,Guava更倾向于提供一些工具类接受一个Iterable而不是一个Collection

你可能感兴趣的:(Google Guava 用户指南)