飞镖:可以 与列表 ,总是使用Iterable?

问题描述 投票:5回答:3

飞镖新手问题。

List是Iterable的子类,有些list方法返回Iterable而不是List,例如List的where method。如果我们将变量声明为List,我们必须在很多地方调用toList

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

编辑

在我的代码库中将一些List更改为Iterable之后,我发现Iterable实例没有add方法。顾名思义,它仅用于迭代。如此明显。

dart
3个回答
4
投票

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

List保证了有效的长度和随机访问操作,并允许访问sortshuffle等功能,这些功能只有在从一开始就能访问所有元素时才有效。他们属于List,因为如果他们一直在Iterable,每一个有效的实现都将从toList开始获得一个列表。

您应该对代码采用相同的方式:如果您想要或期望列表,请将其键入List。如果您可以使用任何集合,请使用Iterable - 这通常意味着您使用的操作都可以通过元素上的for-in实现。如果您在使用之前总是将迭代变换为列表,那么您也可以键入变量List以确保记住列表。

或者,简而言之,如果你不关心它是否真的是SetQueueLinkedList,或者它是不可修改的还是懒惰的,你可以把它变成Iterable

(你通常只应该迭代一次迭代 - 当你想要使用它两次时,你可能最好从它创建一个保证的非延迟集合 - 而List是最便宜的集合来创建)。


2
投票

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

List<E> class

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

Iterable<E> class

通过获取迭代器来访问iterable的元素

Iterator<E> class

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

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

Note:Iterable和Iterator类支持for-in循环。无论何时创建一个可以提供迭代器用于for-in循环的类,都可以扩展(如果可能)或实现Iterable。实现Iterator来定义实际的迭代能力。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.