gpt4 book ai didi

dictionary - 使用 Dart 有条件地返回 Map() 中的元素

转载 作者:行者123 更新时间:2023-12-03 03:25:24 24 4
gpt4 key购买 nike

假设我有一个可迭代对象(可以是映射(键)、列表、集合等),并希望使用 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]);

然而,这会返回一个错误,就像 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]);

当然,有一些方法可以通过在映射值之前或之后循环以过滤掉不需要的值来牺牲效率和简洁性来解决这个问题。如:
List<int> b = a.where((e) => e%2).map((e) => e * 10);
List<int> b = a.map((e) => e * 10).where((e) => e%2);

或者简单地使用 for...in 或 forEach() 手动循环并迭代 a同时有条件地将更改的结果添加到 b ,但这将是冗长的代码,并且将缺乏 map() 对专门操作的优化。

请让我知道这是否可能 - 微优化累积以获得巨大 yield 恕我直言:)。

任何帮助深表感谢!

最佳答案

Of course, there are ways to go around this by sacrificing efficiency and conciseness by looping over it before or after mapping the values to filter out unneeded values.



好吧,效率(如性能)不应该受到影响,因为您正在链接一个一个接一个处理值的迭代器。所以在这里使用 where() 应该不是问题。

如果你想要一个更紧凑的解决方案,你可以这样做(这会为 a 中的每个元素创建一个新的临时列表,这会降低效率):
List<int> b = a.expand((e) => [if (e % 2 == 0) e * 10]).toList();

对于 Map 案例,我认为您能做的最好的事情就是使用 where。我想过另一种解决方案,但结果却是一团糟:
Map<int, String> c = Map.fromEntries(a.entries.expand((e) => [if (e.key % 2 == 0) MapEntry(e.key * 10, e.value)]));

关于dictionary - 使用 Dart 有条件地返回 Map() 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58298739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com