Dart:Iterable <e>与List <e>,始终使用Iterable吗?

时间:2018-09-15 14:37:26

标签: dart

Dart新手问题。

List是Iterable的子类,并且某些列表方法返回Iterable而不是List,例如List的where method。如果我们将变量声明为List,则必须在许多地方调用toList

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

编辑

在我的代码库中将某些列表更改为Iterable之后,我发现Iterable实例没有add方法。顾名思义,它过去仅是迭代。很明显。

3 个答案:

答案 0 :(得分:3)

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

List保证有效的长度和随机访问操作,并提供对sortshuffle之类的功能的访问,仅当它们从一开始就可以访问所有元素时才有效。它们属于List,因为如果它们曾经位于Iterable上,那么每种有效的实现方式都将以执行toList来获得列表的方式开始。

您应该以相同的方式思考代码:如果您想要或期望一个列表,请将其键入为List。如果可以处理任何集合,请使用Iterable-通常意味着您可以使用for-in对元素进行全部操作。 如果始终要在使用迭代器之前将其转换为列表,则最好将变量键入List,以确保您记得创建列表。

或者简而言之,如果您不在乎它实际上是Set还是QueueLinkedList还是不可修改或惰性的,则可以将其设置为{{1 }}。

(您通常应该只迭代一次可迭代的对象-想要使用它两次的那一刻,很可能最好从中创建一个有保证的非延迟集合-并且Iterable是最便宜的收藏集。

答案 1 :(得分:1)

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

List<E> class

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

Iterable<E> class

通过获取Iterator来访问iterable的元素

Iterator<E> class

现在,您可以看到iterable没有任何添加方法。这是故意的。使用iterable有以下好处:

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

Note:Iterable和Iterator类支持for-in循环。每当创建一个可以提供for-in循环中使用的Iterator的类时,都要扩展(如果可能)或实现Iterable。实现Iterator定义实际的迭代能力。

答案 2 :(得分:0)

List最初是完全具体的。 Iterable是“惰性列表”,甚至可能是无限列表。可迭代项根据需要进行计算。它们具有相似的属性,但实现方式不同。