如何解决如何在列表中的所有项目上调用函数?
是否有惯用的方法将功能应用于列表中的所有项目?
例如,在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())
但是更简洁的方法是:
capitalizer = lambda x: x.upper()
regimentNamesCapitalized_m = list(map(capitalizer,regimentNames)); regimentNamesCapitalized_m
在Dart列表中的所有项目上调用函数的等效方法是什么?
解决方法
如果您要将功能应用于List
(或Iterable
)中的所有项目并收集结果,Dart提供了Iterable.map
函数等效于Python的map
:
// Dart
regimentNamesCapitalized_m = regimentNames.map((x) => x.toUpperCase()).toList();
Python还提供了 list comprehensions ,这些通常被认为是Python风格的,并且通常比功能方法更受欢迎:
# Python
regimentNamesCapitalized_m = [x.upper() for x in regimentNames]
Dart等同于Python的列表理解是 collection-for :
// Dart
regimentNamesCapitalized_m = [for (var x in regimentNames) x.toUpperCase()];
如果您出于副作用而调用函数,并且不关心其返回值,则可以使用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);
使用匿名函数:
list.forEach((item){
print(item.toUpperCase());
});
如果该功能仅在一个地方使用,我认为最好使用匿名功能,因为很容易读取列表中发生的事情。
如果要在多个地方使用该函数,则最好传递该函数,而不要使用匿名函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。