如何对列表中的所有项目调用函数?

Pte*_*tyl 5 dart

是否有一种惯用的方法将函数应用于列表中的所有项目?

例如,在 Python 中,假设我们希望将列表中的所有字符串大写,我们可以使用循环:

regimentNames = ['Night Riflemen', 'Jungle Scouts', 'The Dragoons', 'Midnight Revengence', 'Wily Warriors']
# create a variable for the for loop results
regimentNamesCapitalized_f = []

# for every item in regimentNames
for i in regimentNames:
    # capitalize the item and add it to regimentNamesCapitalized_f
    regimentNamesCapitalized_f.append(i.upper())
Run Code Online (Sandbox Code Playgroud)

但更简洁的方法是:

capitalizer = lambda x: x.upper()
regimentNamesCapitalized_m = list(map(capitalizer, regimentNames)); regimentNamesCapitalized_m
Run Code Online (Sandbox Code Playgroud)

在 Dart 中对列表中的所有项目调用函数的等效方法是什么?

jam*_*lin 8

如果您想将函数应用于 a List(或Iterable)中的所有项目收集结果,Dart 提供了一个Iterable.map与 Python 的 等效的函数map

// Dart
regimentNamesCapitalized_m = regimentNames.map((x) => x.toUpperCase()).toList();
Run Code Online (Sandbox Code Playgroud)

Python 还提供了列表推导式,通常被认为更具 Python 风格,并且通常比函数式方法更受青睐:

# Python
regimentNamesCapitalized_m = [x.upper() for x in regimentNames]
Run Code Online (Sandbox Code Playgroud)

Dart 相当于 Python 的列表推导式是collection-for

// Dart
regimentNamesCapitalized_m = [for (var x in regimentNames) x.toUpperCase()];
Run Code Online (Sandbox Code Playgroud)

如果您因函数的副作用而调用函数并且不关心其返回值,则可以使用Iterable.forEach代替Iterable.map. 然而,在这种情况下,我个人更喜欢显式循环

  • 我认为它们由于更常见而更具可读性。
  • 他们更灵活。您可以使用breakcontinue来控制迭代。
  • 他们可能更有效率。.forEach每次迭代涉及额外的函数调用来调用提供的回调。


Pte*_*tyl 3

答案似乎是使用匿名函数,或者将函数传递给列表forEach方法。

传递一个函数:

void capitalise(var string) {
  var foo = string.toUpperCase();
  print(foo);
}

var list = ['apples', 'bananas', 'oranges'];
list.forEach(capitalise);
Run Code Online (Sandbox Code Playgroud)

使用匿名函数:

list.forEach((item){
  print(item.toUpperCase());
});
Run Code Online (Sandbox Code Playgroud)

如果该函数仅在一个地方使用,我认为最好使用匿名函数,因为很容易阅读列表中发生的情况。

如果要在多个地方使用该函数,那么最好传递该函数而不是使用匿名函数。