飞镖新手问题。
List是Iterable的子类,有些list方法返回Iterable而不是List,例如List的where method。如果我们将变量声明为List,我们必须在很多地方调用toList
。
是不是总是将我们的变量声明为Iterable类型而不是List(或任何其他子类型),所以我们的代码是通用的并且易于更改?这样做有什么不利之处吗?这更像是一个最佳实践问题。
编辑
在我的代码库中将一些List更改为Iterable之后,我发现Iterable实例没有add
方法。顾名思义,它仅用于迭代。如此明显。
您应该将变量声明为提供所需功能和保证的最精确类型。
List保证了有效的长度和随机访问操作,并允许访问sort
和shuffle
等功能,这些功能只有在从一开始就能访问所有元素时才有效。他们属于List
,因为如果他们一直在Iterable
,每一个有效的实现都将从toList
开始获得一个列表。
您应该对代码采用相同的方式:如果您想要或期望列表,请将其键入List
。如果您可以使用任何集合,请使用Iterable
- 这通常意味着您使用的操作都可以通过元素上的for-in
实现。如果您在使用之前总是将迭代变换为列表,那么您也可以键入变量List
以确保记住列表。
或者,简而言之,如果你不关心它是否真的是Set
或Queue
或LinkedList
,或者它是不可修改的还是懒惰的,你可以把它变成Iterable
。
(你通常只应该迭代一次迭代 - 当你想要使用它两次时,你可能最好从它创建一个保证的非延迟集合 - 而List
是最便宜的集合来创建)。
List是具有长度的对象的可索引集合。
List<E> class
iterable是可以按顺序访问的值或“元素”的集合。
Iterable<E> class
通过获取迭代器来访问iterable的元素
Iterator<E> class
现在,正如您所见,iterable没有任何add方法。这是故意的。我们从使用iterable获得以下好处:
Note:Iterable和Iterator类支持for-in循环。无论何时创建一个可以提供迭代器用于for-in循环的类,都可以扩展(如果可能)或实现Iterable。实现Iterator来定义实际的迭代能力。
List
从一开始就是完全具体的。 Iterable
是一个“懒惰列表”,甚至可能是一个无限的列表。根据需要计算Iterables。它们具有相似的属性,但具有不同的实现。