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依赖:

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

例如:

  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<String> byLengthOrdering = new Ordering<String>() {
  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<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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,421评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 今天陪朋友逛街,朋友谈起她弟弟为了督促孩子的学习竟被气成了高血压。孩子刚刚上初一,在一所寄宿学校上学。周六孩子要从...
    依心里阅读 487评论 6 7
  • 时间总是悄然溜走~ 而过去的时间对安享娱乐的同学来说,可能就真的只是支指针一圈又一圈,今天过去了,还有明天。 时间...
    淡漠的脚步阅读 613评论 0 0