在Dart中创建新的reduce函数以简化对折叠的调用
在Dart中,我为在Dart中创建新的reduce函数以简化对折叠的调用,dart,Dart,在Dart中,我为Iterableeg提供了一些帮助函数 extension Iterable2 on Iterable<int> { int get max => reduce(math.max); int get min => reduce(math.min); int get sum => reduce((a, b) => a + b); int reduce2<T>(int f(int element)) => fo
Iterable
eg提供了一些帮助函数
extension Iterable2 on Iterable<int> {
int get max => reduce(math.max);
int get min => reduce(math.min);
int get sum => reduce((a, b) => a + b);
int reduce2<T>(int f(int element)) => fold(0, (a, b) => a + f(b));
}
而不是
aList.fold(0, (a, b) => a + afunc(b));
我让reduce2()
接受一个有符号的函数f(int-element)
,因为当我省略参数int
(即f(element)
)时,我无法将afunc
传递给它,因为reduce2()
希望f
有一个dynamic
参数和afunc()
应为int
我希望reduce2()
接受一个函数,该函数可以接受任何参数(无论列表包含什么),而不仅仅是int
例如,reduce2()
int afunc1(int v) => v*v;
int afunc2(String s) => s.length;
int afunc3(MyClass obj) => obj.anIntProperty;
如何更改reduce2()
以接受一个函数,该函数本身可以接受任何对象,但仍然可以进行求和?您当前已在Iterable
的扩展中定义了reduce2
方法,因此您知道元素是整数
您将需要一个不同的扩展,改为在任意iterables上定义:
extension-generalitableextension-on-Iterable{
int reduce2(int函数(T)convert)=>this.fold(0,(a,b)=>a+convert(b));
}
<代码> >谢谢-我在原来的扩展中没有看到<代码> >代码>在您的答案中有一个打印错误:对<代码>的调用< <代码> >应该更改为<代码>折叠>代码>,我通过调用我的方法<代码>减少代码2>代码>混淆,然后调用<代码>折叠< /代码>。与此相关:我确实尝试更新了我原来的扩展名,改为使用
,而不是
,以使sum
在int
s和double
s上工作。我也将返回类型更改为num
,但现在它在double
s上工作,而不是int
s!你能解释一下吗?没有看到它了。如果您将int
的两个匹配项都更改为num
,它应该会工作并返回一个num
。那么最大的问题是它在空列表中返回一个整数零,即使convert
返回一个双精度
。我是作为一个例子来问的。
int afunc1(int v) => v*v;
int afunc2(String s) => s.length;
int afunc3(MyClass obj) => obj.anIntProperty;