【问题标题】:in dart, which is better List.generate or List.of or List.from在 dart 中,哪个更好 List.generate 或 List.of 或 List.from
【发布时间】:2020-08-15 14:48:19
【问题描述】:

in Dart Documentation 我们有三个可迭代的选项可供选择来创建列表。哪个最适合什么目的,哪个更有效?

【问题讨论】:

标签: list dart


【解决方案1】:

基本上,您不应该使用任何这些构造函数。

每个都有它的用途,但现在大多数用途都可以使用列表文字来编写。

List.generate 对应于 List.filled。后者在每个槽中创建一个填充相同值的列表,前者允许您为每个槽计算一个新值。 使用 collection-for,我可能会写:

 var newList = [for (var i = 0; i < 10; i++) compute(i)];

而不是

 var newList = List.generate(10, compute);

(如果我可以内联 compute 函数就更是如此)。 generate 有意义的一种情况是创建一个固定长度的列表。文字无法做到这一点。

我还要说你应该永远使用List.of(something)。 请改用something.toList()[...something]。如果你需要向上转换,比如从Iterable&lt;int&gt; 创建一个List&lt;num&gt;,你可以使用&lt;num&gt;[...something],但你不能使用toList。如果你需要定长List&lt;num&gt;,...那么我认为List&lt;num&gt;.of(something, growable: false)实际上是最简单的解决方案。

使用List.from 的唯一原因是原始可迭代对象没有所需的严格类型。如果您知道您的Iterable&lt;num&gt; 只包含整数,您可能想要做List&lt;int&gt;.from(iterable)。您也可以使用iterable.cast&lt;int&gt;().toList()[for (var v in iterable) v as int],但List.from 可以更短。 总是List.from提供一个类型变量。

所以,一般来说:如果您需要一个固定长度的列表(传递growable: false),或者如果您想使用List.from 向下转换元素,则只使用这些构造函数之一,然后始终提供类型论据。

否则使用列表文字。这可能也会更有效,因为它避免了一些函数调用。

【讨论】:

  • 作为更新,List.generate 现在将是从 Dart 2.9 开始生成空安全列表的最快方法。 github.com/dart-lang/sdk/issues/42283#issuecomment-646167104
  • 我想你在你给我的其他答案之一中告诉了我“吊坠”的含义,但我现在找不到。你说的List.generateList.filled的吊坠”是什么意思
  • 既然你也可以用something.toList(growable: false)创建一个固定长度的列表,那还用List&lt;num&gt;.of(something, growable: false)之类的东西吗?或者它们是等价的吗?
  • 如果您希望从List&lt;int&gt; 创建一个List&lt;num&gt;(以便稍后在列表中添加更多双精度),那么您需要使用List&lt;num&gt;.from(intList)intList.toList() 只能创建一个新的List&lt;int&gt;。否则两者基本等价。 .toList() 有机会稍微提高效率,因为它知道(或可以知道)它所处理的列表的实现,而 List.of 只知道它是一些 Iterable,并且它有一些来自尝试的开销检测可以更有效的情况(例如检查 length 是否有效)。
  • List.toList(...) 实现使用List.of() 构造函数,请问效率从何而来?
【解决方案2】:

List.generate - 如果您的列表源不是 List 类型,或者您在检索列表元素时需要特殊逻辑,这很有用;

List.of - 类型检查在编译时完成。

List.from - 类型检查仅在运行时进行。

List.of 和 List.from 的工作方式相同。但是您应该更喜欢 List.of 而不是 List.from 以确保早在编译时执行类型检查。

如果你想更仔细地看,看看这个例子:https://dartpad.dev/b9cd4acdeec266cb366155c6ec40b4f1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2011-02-22
    • 2013-06-06
    • 2013-11-02
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多