简介
任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法。Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法。这是Guava最流行和成熟的部分之一。我们用相对直观的方式把工具类与特定集合接口的对应关系归纳如下
集合接口 | 属于JDK还是Guava | 对应的Guava工具类 |
---|---|---|
Collection | JDK | Collections2:不要和java.util.Collections混淆 |
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>();
我想我们都认为这很讨厌。因此Guava提供了能够推断范型的静态工厂方法:
List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap();
可以肯定的是,JDK7版本的钻石操作符(<>)没有这样的麻烦:
List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<>();
但Guava的静态工厂方法远不止这么简单。用工厂方法模式,我们可以方便地在初始化时就指定起始元素。
Set<Type> copySet = Sets.newHashSet(elements);
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");
此外,通过为工厂方法命名(Effective Java第一条),我们可以提高集合初始化大小的可读性:
List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);
Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100);
确切的静态工厂方法和相应的工具类一起罗列在下面的章节
注意:Guava引入的新集合类型没有暴露原始构造器,也没有在工具类中提供初始化方法。而是直接在集合类中提供了静态工厂方法,例如:
Multiset<String> multiset = HashMultiset.create();
Iterables
在可能的情况下,Guava提供的工具方法更偏向于接受Iterable而不是Collection类型。在Google,对于不存放在主存的集合——比如从数据库或其他数据中心收集的结果集,因为实际上还没有攫取全部数据,这类结果集都不能支持类似size()的操作 ——通常都不会用Collection类型来表示。
因此,很多你期望的支持所有集合的操作都在Iterables类中。大多数Iterables方法有一个在Iterators类中的对应版本,用来处理Iterator。
截至Guava 1.2版本,Iterables使用FluentIterable类进行了补充,它包装了一个Iterable实例,并对许多操作提供了”fluent”(链式调用)语法。
下面列出了一些最常用的工具方法,但更多Iterables的函数式方法将在第四章讨论
常规方法
concat(Iterable |
串联多个iterables的懒视图* | concat(Iterable…)) |
---|---|---|
frequency(Iterable, Object)) | 返回对象在iterable中出现的次数 | 与Collections.frequency (Collection, Object)比较;Multiset |
partition(Iterable, int)) | 把iterable按指定大小分割,得到的子集都不能进行修改操作 | Lists.partition(List, int)) ;paddedPartition(Iterable, int)) |
getFirst(Iterable, T default)) | 返回iterable的第一个元素,若iterable为空则返回默认值 | 与Iterable.iterator(). next()比较;FluentIterable.first()) |
getLast(Iterable)) | 返回iterable的最后一个元素,若iterable为空则抛出NoSuchElementException | getLast(Iterable, T default)) ; FluentIterable.last()) |
elementsEqual(Iterable, Iterable)) | 如果两个iterable中的所有元素相等且顺序一致,返回true | 与List.equals(Object)比较 |
unmodifiableIterable(Iterable)) | 返回iterable的不可变视图 | 与Collections. unmodifiableCollection(Collection)比较 |
limit(Iterable, int)) | 限制iterable的元素个数限制给定值 | FluentIterable.limit(int)) |
getOnlyElement(Iterable)) | 获取iterable中唯一的元素,如果iterable为空或有多个元素,则快速失败 | getOnlyElement(Iterable, T default)) |