问题 Dart Fold vs Reduce


有什么区别  和 减少 在达特什么时候我会使用一个而不是另一个?他们似乎根据文档做同样的事情。

通过迭代组合每个集合将集合减少到单个值   使用提供的具有现有值的集合的元素   功能。


5471
2017-12-10 10:20


起源

实际上两个函数的文档略有不同。折叠:通过使用提供的函数迭代地将集合的每个元素与现有值组合,将集合减少为单个值。 Reduce:通过使用提供的函数迭代组合集合的元素,将集合减少为单个值。 - Christophe Herreman


答案:


减少 只能用于非空集合,其函数返回与集合中包含的类型相同的类型。

 可以在所有情况下使用。

例如,您无法计算列表中所有字符串长度的总和 reduce。你必须使用 fold :

final list = ['a', 'bb', 'ccc'];
// compute the sum of all length
list.fold(0, (t, e) => t + e.length); // result is 6

顺便一提 list.reduce(f) 可以看作是一种捷径 list.skip(1).fold(list.first, f)


15
2017-12-10 10:28



我认为你不能做的例子是不对的,如print([1,2,3] .reduce((a,b)=>“$ a $ b”))=>“123”。但那是因为“1”.toString()=>“1”。 - Alan Knight
确切,我的例子几乎是正确的。我已经更新了我的答案 <int>[1,2,3]。同 print(<int>[1,2,3].reduce((a, b) => "$a$b")) 你得到例外: type'String'不是'function result'类型'int'的子类型 在运行时以检查模式运行并且分析器发出警告: 参数类型'(dynamic,dynamic) - > String'不能分配给参数类型'(int,int) - > int'。感谢您的反馈。 - Alexandre Ardhuin
选择一个不能通过删除类型或运行未选中而无法“修复”的示例可能会更好。 - Alan Knight
我已经更新了这个例子,我希望它更好。 - Alexandre Ardhuin
是的,这是一个很好的。 - Alan Knight