You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:06:32