在Dart中创建新的reduce函数以简化对折叠的调用

在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

在Dart中,我为
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;