Dart中map方法返回List<List<Object>>而非List<Object>的解决方法
问题原因
两层map遍历的逻辑中,外层map针对每一个Truck对象返回的是一个List<TruckFruit>,最终聚合后的结果自然是List<List<TruckFruit>>类型的二维嵌套列表,要得到单层的List<TruckFruit>,只需要把内层生成的子列表展开拼接即可。
实现方案
- 方案1:使用
expand方法展平(推荐,写法最简洁)expand方法会将每个元素映射为可迭代对象后,自动把所有可迭代对象的元素拼接为一个单层可迭代序列,不需要在内层提前调用toList():
final listTruckFruits = event.trucks .expand((truck) => truck.fruits.map( (fruit) => TruckFruit( truckOrigin: truck.info.origin, fruitType: fruit.type, ), )) .toList();
- 方案2:映射后统一展平
如果保留原有两层map的写法,可以在映射完成后额外调用一次expand把嵌套的列表拆开,再转成列表:
final listTruckFruits = event.trucks .map((truck) => truck.fruits.map( (fruit) => TruckFruit( truckOrigin: truck.info.origin, fruitType: fruit.type, ), )) .expand((innerFruitList) => innerFruitList) .toList();
- 方案3:使用集合for循环写法(逻辑直观)
Dart内置的集合支持嵌套for循环的写法,直接在列表字面量里写两层遍历,不需要额外调用展平方法:
final listTruckFruits = [ for (final truck in event.trucks) for (final fruit in truck.fruits) TruckFruit( truckOrigin: truck.info.origin, fruitType: fruit.type, ) ];
三种写法最终输出结果完全一致,都是单层
List<TruckFruit>类型,可根据团队代码规范和个人习惯选择。
内容的提问来源于stack exchange,提问作者Sunshine
相关产品推荐
相关产品推荐

