是否有一种惯用的方法将函数应用于列表中的所有项目?
例如,在 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 中对列表中的所有项目调用函数的等效方法是什么?
如果您想将函数应用于 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. 然而,在这种情况下,我个人更喜欢显式循环:
break或continue来控制迭代。.forEach每次迭代涉及额外的函数调用来调用提供的回调。答案似乎是使用匿名函数,或者将函数传递给列表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)
如果该函数仅在一个地方使用,我认为最好使用匿名函数,因为很容易阅读列表中发生的情况。
如果要在多个地方使用该函数,那么最好传递该函数而不是使用匿名函数。