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

Flutter中如何高效将对象列表整理为按属性分组的Map?

在Flutter中高效分组对象列表(低内存、高性能)

要实现最快且内存效率最高的对象列表分组,直接使用原生for循环是最优方案——它避免了高阶函数的额外调用开销,且分组后的列表仅持有原对象的引用,不会复制主列表中的对象,内存占用极低。

最优实现代码

替换你代码中for循环内的???部分,使用Map.putIfAbsent完成“检查键存在性-初始化列表-添加对象”的逻辑:

void main() {
  List<Car> cars = [
    Car('BMW', 5),
    Car('Mercedes', 5),
    Car('Mercedes', 4),
    Car('Mercedes', 2),
    Car('Ferarri', 2),
    Car('Ferarri', 4),
    Car('BMW', 6),
    Car('BMW', 2),
    Car('BMW', 4),
    Car('McLaren', 3),
  ];

  Map<String, List<Car>> organizedCars = {};

  for (Car car in cars) {
    // 若品牌不存在则初始化空列表,再添加当前车辆
    organizedCars.putIfAbsent(car.name, () => []).add(car);
  }

  // 验证输出(可选)
  organizedCars.forEach((brand, carList) {
    print('$brand: ${carList.map((c) => c.passangers).toList()}');
  });
}

class Car {
  String name;
  int passangers;

  Car(this.name, this.passangers);
}

方案优势

  • 极致性能:原生for循环是Dart中遍历集合的最快方式,没有groupBy这类高阶函数的封装开销,处理数千条数据毫无压力。
  • 低内存占用:分组后的List<Car>仅存储原列表对象的引用,不会复制任何Car实例,额外内存仅为Map结构和空列表的初始空间。
  • 代码简洁:putIfAbsent方法将多步逻辑合并为一行,可读性强。

备选方案(代码更简洁,性能略低)

如果对极致性能要求不高,可使用package:collection中的groupBy方法,代码更简洁:

  1. 先在pubspec.yaml添加依赖:collection: ^1.18.0(或最新版本)
  2. 实现代码:
import 'package:collection/collection.dart';

void main() {
  List<Car> cars = [...]; // 原列表
  Map<String, List<Car>> organizedCars = groupBy(cars, (Car car) => car.name);
}

注意:该方法内部仍是基于循环实现,但多了一层函数调用,性能略低于原生循环,不过数千条数据量级下差异可忽略。

内容的提问来源于stack exchange,提问作者RobbB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:32:47