首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Iterable<E>和List<E>,总是使用Iterable吗?

Iterable<E>和List<E>,总是使用Iterable吗?
EN

Stack Overflow用户
提问于 2018-09-15 14:37:26
回答 3查看 28.7K关注 0票数 38

飞镖新手的问题。

List是Iterable的子类,一些list方法返回Iterable而不是List,例如List的何地法。如果我们将一个变量声明为List,那么我们必须在许多地方调用toList

最好总是将变量声明为Iterable类型,而不是List (或任何其他子类型),这样我们的代码是通用的,易于更改吗?这样做有什么坏处吗?这更像是一个最佳实践问题。

编辑

在我的代码库中将一些列表更改为Iterable之后,我发现Iterable实例没有add方法。如其名称所示,它只用于迭代。太明显了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-16 10:31:47

您应该将变量声明为提供所需功能和保证的最精确的类型。

List保证有效的长度和随机访问操作,并提供对像sortshuffle这样的功能的访问,这些功能只有在从一开始就访问所有元素时才是有效的。它们属于List,因为如果它们在Iterable上,那么每个有效的实现都会从执行toList来获得列表开始。

您应该以同样的方式看待您的代码:如果您想要或期望得到一个列表,请将其输入为List。如果您可以处理任何集合,请使用Iterable --这通常意味着您使用的操作都可以由元素上的for-in实现。如果在使用之前总是要将一个可迭代的列表转换为一个列表,那么您最好键入变量和List,以确保您记住要生成列表。

或者,简单地说,如果您不关心它实际上是一个SetQueue还是LinkedList,或者它是不可修改的还是懒惰的,那么您可以将它变成Iterable

(通常情况下,您应该只迭代一次--当您想使用它两次时,很可能最好从它创建一个有保证的非懒惰集合- List是创建的最便宜的集合)。

票数 40
EN

Stack Overflow用户

发布于 2018-09-15 18:13:35

List是具有长度的对象的可索引集合。

代码语言:javascript
复制
List<E> class

可迭代是可以按顺序访问的值或“元素”的集合。

代码语言:javascript
复制
Iterable<E> class

通过获取Iterator来访问可迭代的元素。

代码语言:javascript
复制
Iterator<E> class

现在,如您所见,iterable没有任何add方法。这是故意的。我们从使用可迭代性中获得以下好处:

  • 使用迭代器,我们可以更安全地访问列表。防止意外重写列表,因为每次只能访问一个项。
  • 允许在包含列表的类中保留修改列表的逻辑。其他人可以安全地使用它。
  • 这迫使我们将与列表相关的所有复杂操作保留在其定义类中。

备注:Iterable和Iterator类支持-in循环.每当您创建一个可以提供迭代器用于for-in循环的类时,就扩展(如果可能)或实现Iterable。实现Iterator来定义实际的迭代能力。

票数 17
EN

Stack Overflow用户

发布于 2018-09-15 17:38:24

List从一开始就完全是具体的。Iterable是一个“懒惰列表”,甚至可能是一个无限列表。根据需要计算迭代值。它们具有相似的属性,但实现方式不同。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52345694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档