背景
先来回顾一下 JDK 的 Collections
, java.util.Collections
提供了一系列静态方法,能更方便地操作各种集合。
比如:
-
创建空集合 Collections.emptyList(); -
创建单元素集合 Collections.singletonList("apple"); -
排序 Collections.sort(list); -
创建不可变集合 Collections.unmodifiableList(mutable); -
创建线程安全集合 Collections.synchronizedList(list); -
......
Guava 沿着 Collections 的思路 提供了 更多的工具方法,适用于所有集合的静态方法,使之成为更强大的集合工具类。
Guava 提供的集合工具不止是对 Collections 的扩展和增强,还包括了其他集合类型的工具类,我们把工具类与特定集合接口的对应关系归纳如下:
Interface | JDK or Guava? | 对应 Guava 工具类 |
---|---|---|
Collection |
JDK | Collections2 |
List |
JDK | Lists |
Set |
JDK | Sets |
SortedSet |
JDK | Sets |
Map |
JDK | Maps |
SortedMap |
JDK | Maps |
Queue |
JDK | Queues |
Multiset |
Guava | Multisets |
Multimap |
Guava | Multimaps |
BiMap |
Guava | Maps |
Table |
Guava | Tables |
静态构造器
在 JDK 7 之前,构造新的范型集合时要讨厌地重复声明范型:
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>();
JDK 7 以后因为有了钻石操作符(Diamond Operator)可以自动推断参数类型,所以省点儿事儿
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<>();
用 Guava 可以这样写:
List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
你可能觉得:这没什么牛的呀,跟 JDK7 以后没啥区别呀,人家还是原生的。
是的,没错,尤其是你用 JDK 9 以后的版本,JDK 从功能上跟 Guava 就基本一样了,举个例子,比如带元素初始化:
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");
上面这行是利用了 Guava 的 Lists ,JDK 7 没有比这行代码更好的方法,但 JDK9 人家有,比如:
List<String> theseElements2 = List.of("alpha", "beta",