首页 > 解决方案 > 如何对列表中的所有项目调用函数?

问题描述

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

例如,在 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 列表中的所有项目上调用函数的等效方法是什么?

标签: dart

解决方案


如果你想对 a List(or Iterable)中的所有项目应用一个函数收集结果,Dart 提供了一个Iterable.map相当于 Python 的函数map

// Dart
regimentNamesCapitalized_m = regimentNames.map((x) => x.toUpperCase()).toList();

Python 还提供了列表推导,这通常被认为更 Pythonic 并且通常比函数式方法更受欢迎:

# 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. 但是,在这种情况下,我个人更喜欢显式循环

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

推荐阅读