Dart中能否使用List的map方法为每个源列表项生成2个及以上元素?
Dart 实现单列表项映射为多个输出项的可行方案
直接使用List.map无法实现需求的核心原因是:map是严格的1:1映射方法,每个输入元素仅对应回调返回的1个结果,无法直接输出多个项。你可以通过以下两种方式实现和Python示例完全一致的效果:
- 方法1:使用
expand方法(链式调用写法)expand是Dart迭代器内置的1:N映射方法,回调为每个输入项返回一个可迭代对象,最终会自动将所有可迭代对象打平为单层结构:
void main() { final intLst = [1, 2, 3]; final f1 = (int x) => x; final f2 = (int x) => x * 10; // 每个元素对应返回多个计算结果,expand自动打平 final newLst = intLst.expand((x) => [f1(x), f2(x)]).toList(); print(newLst); // 输出 [1, 10, 2, 20, 3, 30] }
如果一定要结合map使用,只需要额外加一步展开即可:
final newLst = intLst.map((x) => [f1(x), f2(x)]).expand((subList) => subList).toList();
需要生成更多项时,直接在回调返回的列表中追加对应计算逻辑即可,比如要生成3项就写[f1(x), f2(x), x * 100]。
- 方法2:使用集合内for循环(和Python列表推导逻辑对齐)
Dart支持在列表字面量中嵌套循环逻辑,写法和你给出的Python代码几乎一致,不需要额外调用迭代器方法:
void main() { final intLst = [1, 2, 3]; final f1 = (int x) => x; final f2 = (int x) => x * 10; final newLst = [ for (final x in intLst) for (final f in [f1, f2]) f(x) ]; print(newLst); // 输出 [1, 10, 2, 20, 3, 30] }
注意:上述示例生成的都是可增长列表,如果需要固定长度列表,可以在调用
toList()时传入growable: false参数。
内容的提问来源于stack exchange,提问作者Jean-Pierre Schnyder
相关产品推荐
相关产品推荐

