Dart - 何时在集合上使用 Collection-For-In 与 .Map()

Dart - When To Use Collection-For-In vs .Map() on Collections

collection-for-in 操作和 .map() 方法都可以 return 对先前集合中的元素进行一些操作。有什么理由更喜欢使用其中之一吗?

var myList = [1,2,3];
var alteredList1 = [for(int i in myList) i + 2]; //[3,4,5]
var alteredList2 = myList.map((e) => e + 2).toList(); //[3,4,5]

使用更容易和更易读的那个。 这是一个故意含糊的答案,因为这取决于你在做什么。

任何时候你有一些以 .toList() 结尾的东西,我至少会 考虑 把它变成一个列表文字。如果 mapwhere 的主体很简单,您通常可以使用 for/in(加上 if for where). 然后,有时它会变得复杂,您需要使用同一个变量两次,或者 map 计算使用 while 循环,或者其他不适合列表文字语法的东西。

然后你可以保留辅助函数并执行 [for (var e in something) helperFunction(e)] 或者只执行 something.map((e) { body of helper function }).toList()。在许多情况下,后者更具可读性。

因此,如果您的可迭代代码以 toList 结尾,请考虑使用列表文字,但如果文字变得过于复杂,请不要因为使用 .map(...).toList() 方法而感到难过。

可读性才是真正重要的。

不是专家,但我个人更喜欢第一种方法。一些原因:

  1. 您可以在同一列表中包含其他元素(独立于 for 循环):

    var a = [1, 2, 3];
    bool include5 = true;
    var b = [
      1,
      for (var i in a) i + 1,
      if (include5) 5,
    ];
    print(b); // [1, 2, 3, 4, 5]
    
  2. 有时,当将模型映射到 Widget 列表时,.map().toList() 方法会生成 List<dynamic>,隐式转换将不起作用。当你遇到这样的错误时,请避免使用第二种方法。