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

use*_*375 10 dart

飞镖新手问题。

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

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

编辑

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

Ran*_*rtz 7

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


lrn*_*lrn 7

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

List保证有效的长度和随机访问操作,并提供对sort和之类的功能的访问,shuffle仅当它们从一开始就可以访问所有元素时才有效。之所以选择它们,List是因为如果它们处于on状态Iterable,那么每一个有效的实现都将从开始toList获取列表开始。

您应该以相同的方式思考代码:如果您想要或期望一个列表,请将其键入为List。如果可以处理任何集合,请使用Iterable-,这通常意味着您所使用的操作都可以通过一个for-inover元素来实现。如果在使用它之前总是打算将一个可迭代对象转换为列表,则最好将变量键入为List以确保记住要创建列表。

或者,简而言之,如果您不在乎它实际上是Set还是Queue或,LinkedList或者它是否不可修改或惰性,可以将其设置为Iterable

(你应该还是一般只迭代一个可迭代一次-你想用它两倍的时刻,这是可能的,你会更好,从它创建一个保证无延迟的集合-并且List是创造最廉价的集合)。


Jit*_*a A 5

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

List<E> class
Run Code Online (Sandbox Code Playgroud)

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

Iterable<E> class
Run Code Online (Sandbox Code Playgroud)

通过获取Iterator可以访问iterable的元素

Iterator<E> class
Run Code Online (Sandbox Code Playgroud)

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

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

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