飞镖新手的问题。
List是Iterable的子类,一些list方法返回Iterable而不是List,例如List的何地法。如果我们将一个变量声明为List,那么我们必须在许多地方调用toList。
最好总是将变量声明为Iterable类型,而不是List (或任何其他子类型),这样我们的代码是通用的,易于更改吗?这样做有什么坏处吗?这更像是一个最佳实践问题。
编辑
在我的代码库中将一些列表更改为Iterable之后,我发现Iterable实例没有add方法。如其名称所示,它只用于迭代。太明显了。
发布于 2018-09-16 10:31:47
您应该将变量声明为提供所需功能和保证的最精确的类型。
List保证有效的长度和随机访问操作,并提供对像sort和shuffle这样的功能的访问,这些功能只有在从一开始就访问所有元素时才是有效的。它们属于List,因为如果它们在Iterable上,那么每个有效的实现都会从执行toList来获得列表开始。
您应该以同样的方式看待您的代码:如果您想要或期望得到一个列表,请将其输入为List。如果您可以处理任何集合,请使用Iterable --这通常意味着您使用的操作都可以由元素上的for-in实现。如果在使用之前总是要将一个可迭代的列表转换为一个列表,那么您最好键入变量和List,以确保您记住要生成列表。
或者,简单地说,如果您不关心它实际上是一个Set、Queue还是LinkedList,或者它是不可修改的还是懒惰的,那么您可以将它变成Iterable。
(通常情况下,您应该只迭代一次--当您想使用它两次时,很可能最好从它创建一个有保证的非懒惰集合- List是创建的最便宜的集合)。
发布于 2018-09-15 18:13:35
List是具有长度的对象的可索引集合。
List<E> class可迭代是可以按顺序访问的值或“元素”的集合。
Iterable<E> class通过获取Iterator来访问可迭代的元素。
Iterator<E> class现在,如您所见,iterable没有任何add方法。这是故意的。我们从使用可迭代性中获得以下好处:
备注:Iterable和Iterator类支持-in循环.每当您创建一个可以提供迭代器用于for-in循环的类时,就扩展(如果可能)或实现Iterable。实现Iterator来定义实际的迭代能力。
发布于 2018-09-15 17:38:24
List从一开始就完全是具体的。Iterable是一个“懒惰列表”,甚至可能是一个无限列表。根据需要计算迭代值。它们具有相似的属性,但实现方式不同。
https://stackoverflow.com/questions/52345694
复制相似问题