Ter*_*ado 9 dictionary iterator arraylist filter dart
假设我有一个可迭代对象(可以是映射(键)、列表、集合等),并且希望使用 Map() 将其转换为具有函数 f 的另一个可迭代对象。然而,我希望 f 在转换后仅在满足条件时返回一个值。
List<int> a = [1,2,3,4,5,6];
List<int> b = a.map((e) => (e % 2 == 0) ? e * 10 : null);
assert(b == [20,40,60]);
Run Code Online (Sandbox Code Playgroud)
然而,这会返回一个错误,就像map中带有mapEntry的任何类似的等效项一样,例如:
Map<int, String> a = {1:a, 2:b, 3:c, 4:d, 5:e, 6:f};
Map<int, String> b = a.map((k,v) => (k % 2 == 0) ? MapEntry(k*10,v) : null);
assert(b.keys.toList<int>() == [20,40,60]);
Run Code Online (Sandbox Code Playgroud)
当然,有一些方法可以通过牺牲效率和简洁性来解决这个问题,即在映射值之前或之后循环遍历它以过滤掉不需要的值。例如:
List<int> b = a.where((e) => e%2).map((e) => e * 10);
List<int> b = a.map((e) => e * 10).where((e) => e%2);
Run Code Online (Sandbox Code Playgroud)
或者简单地使用 for...in 或 forEach() 手动循环并迭代,a同时有条件地将更改的结果添加到b,但这将是冗长的代码,并且缺乏 map() 对于专门操作的优化。
请让我知道这是否可能 - 微观优化积累大收益恕我直言:)。
任何帮助深表感谢!
当然,有一些方法可以通过牺牲效率和简洁性来解决这个问题,即在映射值之前或之后循环遍历它以过滤掉不需要的值。
好吧,效率(如性能)不应该受到影响,因为您正在链接一一处理值的迭代器。因此,使用 where() 在这里应该不是问题。
如果你想要一个更紧凑的解决方案,你可以这样做(这会为 a 中的每个元素创建一个新的临时 List,这会降低效率):
List<int> b = a.expand((e) => [if (e % 2 == 0) e * 10]).toList();
Run Code Online (Sandbox Code Playgroud)
对于 Map 的情况,我认为你能做的最好的事情就是使用 where。我想到了另一个解决方案,但最终陷入了困境:
Map<int, String> c = Map.fromEntries(a.entries.expand((e) => [if (e.key % 2 == 0) MapEntry(e.key * 10, e.value)]));
Run Code Online (Sandbox Code Playgroud)