Dart中如何更简洁遍历对象列表,满足条件时返回子列表且仅遍历一次?
解决方案
可以通过直接映射+条件查找的方式一步到位获取目标Stuff子列表,无需先拿到Thing对象再提取属性,写法更简洁,且不会产生多余遍历:
final targetStuffs = things .map((thing) => thing.stuffs) .firstWhere( (stuffs) => stuffs.any((s) => s.x == 'y'), orElse: () => [], // 处理找不到匹配项的情况,返回空列表 );
说明
map((thing) => thing.stuffs):将每个Thing对象直接转换为对应的stuffs列表,跳过中间持有Thing对象的步骤。firstWhere:遍历转换后的列表,找到第一个包含x值为'y'的Stuff元素的列表,找到后立即停止遍历,避免不必要的计算。orElse参数:可选,用于处理没有匹配项的场景,防止抛出StateError,这里返回空列表作为默认值。
如果确定列表中一定存在符合条件的项,也可以简化为:
final targetStuffs = things .map((thing) => thing.stuffs) .firstWhere((stuffs) => stuffs.any((s) => s.x == 'y'));
内容的提问来源于stack exchange,提问作者user20824592
相关产品推荐
相关产品推荐

