Dart如何移除嵌套列表中的null项 实现可空嵌套列表过滤
Dart 嵌套可空列表Null值过滤实现
符合签名的最优实现
直接用Dart原生迭代器懒加载方法实现,无额外依赖,无类型安全问题:
Iterable<Iterable<int>> removeNullItems(Iterable<Iterable<int?>?> nullableItemList) { return nullableItemList // 过滤外层为null的内层列表 .whereType<Iterable<int?>>() // 逐个过滤内层列表中的null元素,自动转换为非空int类型迭代器 .map((innerList) => innerList.whereType<int>()); }
实现说明
- 为什么不能直接用
whereType<Iterable<int>>()过滤外层:Dart泛型在运行时会保留类型信息,Iterable<int?>和Iterable<int>属于不同的运行时类型,直接按Iterable<int>过滤会把所有非空的、存储可空int的内层列表全部误筛,最终得到空结果。 - 性能表现:整个实现是懒执行的,和原生
whereType行为完全一致,不会在方法调用时就全量遍历拷贝所有数据,只有实际迭代访问元素时才会触发过滤逻辑,时间和内存开销都是最优水平。 - 可读性:链式调用的逻辑和一维列表过滤的思路完全对齐,每一步的处理意图清晰,不需要写复杂的嵌套判空、类型强转逻辑,后续维护成本低。
如果业务场景需要得到可随机访问的嵌套List结构,只需要给内层、外层的处理结果追加
toList()调用即可,示例:List<List<int>> removeNullItemsAsList(Iterable<Iterable<int?>?> nullableItemList) { return nullableItemList .whereType<Iterable<int?>>() .map((innerList) => innerList.whereType<int>().toList()) .toList(); }
内容的提问来源于stack exchange,提问作者Chris Wickens
相关产品推荐
相关产品推荐

