我不喜欢无缘无故使用索引数组,只因为我认为它看起来很丑陋。是否有一种简洁的方式可以使用匿名函数进行求和?是否可能在不使用任何外部变量的情况下完成此操作?
var sum = [1, 2, 3].reduce((a, b) => a + b);
int sum = [1, 2, 3].fold(0, (previous, current) => previous + current);
int sum = [1, 2, 3].fold(0, (p, c) => p + c);
.fold
妈妈:我们家已经有.fold
了
家里的.fold
就是.reduce
。 - SEG.Veenstra这是一个非常古老的问题,但是
只需导入即可。
import 'package:collection/collection.dart';
并在 Iterable
上调用 .sum
扩展方法。
FULL EXAMPLE
import 'package:collection/collection.dart';
void main() {
final list = [1, 2, 3, 4];
final sum = list.sum;
print(sum); // prints 10
}
如果列表为空,.sum
返回 0
。你可能也会对 list.average
感兴趣...list.sublist(0,3).sum
,它将从索引 0 开始加总,直到排除索引 3。 - tmaihoff.take(int count)
方法,让您省略下限的“0”,并创建一个惰性迭代器而不是列表(如果您不需要像“sum”获取器一样的所有项,则可能更具性能)。 - David Schneider我仍然认为对于这个特定问题来说,这是更简洁易懂的。
num sum = 0;
[1, 2, 3].forEach((num e){sum += e;});
print(sum);
或者num sum = 0;
for (num e in [1,2,3]) {
sum += e;
}
目前使用核心库没有一种干净的方法来完成它,但是如果你自己编写foldLeft,那么就有可能实现。
main() {
var sum = foldLeft([1,2,3], 0, (val, entry) => val + entry);
print(sum);
}
Dynamic foldLeft(Collection collection, Dynamic val, func) {
collection.forEach((entry) => val = func(val, entry));
return val;
}
我与Dart团队讨论过将foldLeft添加到核心集合中,希望它能很快被添加进去。
从 Dart 2.6 开始,你可以使用扩展方法在 List 上定义实用的方法。这适用于数字(示例 1),也适用于通用对象(示例 2)。
extension ListUtils<T> on List<T> {
num sumBy(num f(T element)) {
num sum = 0;
for(var item in this) {
sum += f(item);
}
return sum;
}
}
示例1(对列表中的所有数字求和):
var numbers = [1, 2, 3];
var sum = numbers.sumBy((number) => number);
示例2(求所有Point.x字段的和):
var points = [Point(1, 2), Point(3, 4)];
var sum = points.sumBy((point) => point.x);
我只是想为 @tmaihoff 的答案(关于使用 collection.dart 包)添加一些小细节:
他所说的 sum
getter 只适用于包含 num
值的可迭代对象,例如 List<int>
或 Set<double>
。
如果你有一个由其他表示值的对象类型组成的列表(例如 Money
、Decimal
、Rational
或其他任何类型),则必须将其映射为数字。例如,要计算字符串列表中字符的数量,可以执行以下操作:
// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].map((e) => e.length).sum;
sumBy()
方法:// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].sumBy((e) => e.length), 15);
T sum<T extends num>(T lhs, T rhs) => lhs + rhs;
由于int,double和float都扩展自num类,因此您可以使用该函数来对任何数字求和。List<int> a = [1,2,3];
int result = a.reduce(sum);
print(result); // result will be 6
如果使用fold时出现double
TypeError错误,您可以使用reduce函数:
var sum = [0.0, 4.5, 6.9].reduce((a, b) => a + b);
以下是我的方法:
void main() {
int value = sumTwo([1, 4, 3, 43]);
print(value);
}
int sumTwo(List < int > numbers) {
int sum = 0;
for (var i in numbers) {
sum = sum + i;
}
return sum;
}
.fold()
可以处理这种情况。 - Gazihan AlankusList
为空,则会出现错误Uncaught Error: Bad state: No element
。在执行var sum = [1, 2, 3].reduce((a, b) => a + b);
语句之前,我已经检查了List.length
并且它对我起作用了。谢谢。 - Kamlesh