我注意到Google Guava Sets
类提供newHashSet
等Iterable
或Iterator
等方法。与Java捆绑在一起的HashSet
类已经提供了一个带Collection
的构造函数,从而提供了类似的行为。
所以我很好奇......这些特殊的静态方法在番石榴套装中有什么优势?是否只有Iterable
或Iterator
个对象不也是Collection
?或者番石榴团队是否还有其他目的需要包括这些方法?
答案 0 :(得分:5)
Iterable
接口是在Java 1.5中引入的,是Collection
接口的基本接口
HashSet
构造函数早于此修改,我认为为了兼容性,他们已将其保留在Java 1.5中
另一方面,Guava不受此更改的限制,为方便起见,提供了Iterator
的构造函数。
默认情况下,Iterable
构造函数会尝试将Iterable
投射到Collection
,如果不可能,则会提取Iterator
并调用{{1}构造函数。
在我看来,这为图书馆用户提供了更好的灵活性。
存在Iterator
实用程序类的另一个原因是在调用泛型构造函数时,Java 1.5和1.6中需要进行长手写操作。
这个特殊问题在1.7中通过引入钻石算子解决了。
举例说明。
1.7之前
Sets
1.7之后
ArrayList<String> myList = ...
// See generic parameter repeated
HashSet<String> mySet = new HashSet<String>( myList );
// No such issue for statics
HashSet<String> myGuavaSet = Sets.newHashSet( myList );
答案 1 :(得分:4)
根据Google Guava文档,CollectionUtilitiesExplained:
只要有可能,Guava更愿意提供接受
Iterable
而不是Collection
的实用程序。在Google,遇到一个实际上并未存储在主内存中的“集合”并不是一般的,而是从数据库或其他数据中心收集,并且不能支持像{{1没有实际抓住所有元素。因此,可以在
size()
中找到您希望看到的所有集合支持的许多操作。此外,大多数Iterables
方法在Iterables
中都有一个接受原始迭代器的相应版本。
Iterators
类中的绝大多数操作都是懒惰的:它们只在绝对必要时才推进后备迭代。自己返回Iterables
的方法返回延迟计算的视图,而不是在内存中显式构建集合。