Dart:从Iterable中移除元素直至满足指定条件
解决方案
首先需要明确:Dart 的 Iterable 本身是不可变的,无法直接移除元素,所以第一步需要将其转换为可修改的 List。针对你的需求,虽然没有完全匹配的内置函数,但可以通过封装扩展方法的方式实现优雅的调用,同时保证逻辑简洁高效。
实现思路
- 将
Iterable<MyClass>转为List,以便修改元素; - 计算所有元素
data属性的字符总长度; - 从列表末尾开始移除元素,每次移除后更新总长度,直到总长度低于设定阈值。
代码实现
首先定义 MyClass 示例:
class MyClass { final String data; MyClass(this.data); }
然后为 Iterable<MyClass> 添加扩展方法:
extension TrimIterableByDataLength on Iterable<MyClass> { List<MyClass> trimToDataThreshold(int threshold) { final list = toList(); int totalLength = fold(0, (sum, item) => sum + item.data.length); // 从末尾移除元素直到总长度低于阈值 while (totalLength >= threshold && list.isNotEmpty) { final removedItem = list.removeLast(); totalLength -= removedItem.data.length; } return list; } }
使用方式
调用时只需一行代码,非常简洁:
void main() { final items = [ MyClass("Hello"), MyClass("World"), MyClass("Dart"), ]; final threshold = 10; final trimmedItems = items.trimToDataThreshold(threshold); // 最终剩余 ["Hello"],总长度5 < 10 }
说明
- 这种方式的时间复杂度是 O(n),只需要遍历到满足条件的位置就停止,效率很高;
- 扩展方法的封装让调用逻辑更优雅,符合 Dart 的代码风格;
- 如果初始总长度已经低于阈值,会直接返回原列表,无需任何修改。
内容的提问来源于stack exchange,提问作者progNewbie
相关产品推荐
相关产品推荐

