Dart新手问题。
List是Iterable的子类,并且某些列表方法返回Iterable而不是List,例如List的where method。如果我们将变量声明为List,则必须在许多地方调用toList
。
始终将变量声明为Iterable类型而不是List(或任何其他子类型)是否更好,所以我们的代码通用且易于更改?这样做有什么缺点吗?这更像是一个最佳实践问题。
编辑
在我的代码库中将某些列表更改为Iterable之后,我发现Iterable实例没有add
方法。顾名思义,它过去仅是迭代。很明显。
答案 0 :(得分:3)
您应该将变量声明为提供功能并保证您需要的最精确的类型。
List保证有效的长度和随机访问操作,并提供对sort
和shuffle
之类的功能的访问,仅当它们从一开始就可以访问所有元素时才有效。它们属于List
,因为如果它们曾经位于Iterable
上,那么每种有效的实现方式都将以执行toList
来获得列表的方式开始。
您应该以相同的方式思考代码:如果您想要或期望一个列表,请将其键入为List
。如果可以处理任何集合,请使用Iterable
-通常意味着您可以使用for-in
对元素进行全部操作。
如果始终要在使用迭代器之前将其转换为列表,则最好将变量键入List
,以确保您记得创建列表。
或者简而言之,如果您不在乎它实际上是Set
还是Queue
或LinkedList
还是不可修改或惰性的,则可以将其设置为{{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
是“惰性列表”,甚至可能是无限列表。可迭代项根据需要进行计算。它们具有相似的属性,但实现方式不同。