在 dart 中,List.generate 或 List.of 或 List.from 哪个更好

rus*_*kar 4 list dart

在 Dart 文档中,我们提供了三个可迭代选项来创建列表。哪一个最适合什么目的,哪一个对于什么目的更有效?

lrn*_*lrn 13

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

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

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

 var newList = [for (var i = 0; i < 10; i++) compute(i)];
Run Code Online (Sandbox Code Playgroud)

代替

 var newList = List.generate(10, compute);
Run Code Online (Sandbox Code Playgroud)

(如果我可以内联该函数,则更是如此compute)。一种generate有意义的情况是创建一个固定长度的列表。字面意思是做不到这一点的。

我还想说你永远不应该使用List.of(something). 使用something.toList()[...something]代替。如果您需要向上转换,例如List<num>从 an创建 a Iterable<int>,您可以执行<num>[...something],但不能使用toList。如果您需要制作固定长度 List<num>,...那么我认为List<num>.of(something, growable: false)实际上是最简单的解决方案。

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

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

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

  • 作为更新,从 Dart 2.9 开始,“List.generate”现在将成为空安全列表生成的最快方法。https://github.com/dart-lang/sdk/issues/42283#issuecomment-646167104 (2认同)