我不喜欢使用索引数组,除了我觉得它看起来很难看.是否有一种与匿名函数相加的简洁方法?是否可以在不使用任何外部变量的情况下完成?
Tob*_*obi 83
这是一个非常古老的问题但是
只需导入
import 'package:collection/collection.dart';
Run Code Online (Sandbox Code Playgroud)
并调用.sum上的扩展方法Iterable。
完整示例
import 'package:collection/collection.dart';
void main() {
final list = [1, 2, 3, 4];
final sum = list.sum;
print(sum); // prints 10
}
Run Code Online (Sandbox Code Playgroud)
如果列表为空,.sum则返回0。
你也可能对此有兴趣list.average...
Art*_*ure 30
Dart iterables现在有一个reduce函数(https://code.google.com/p/dart/issues/detail?id=1649),所以你可以简单地做一个总和而不定义你自己的fold函数:
var sum = [1, 2, 3].reduce((a, b) => a + b);
Run Code Online (Sandbox Code Playgroud)
Col*_*oan 17
int sum = [1, 2, 3].fold(0, (previous, current) => previous + current);
Run Code Online (Sandbox Code Playgroud)
或者使用较短的变量名称以减少占用空间:
int sum = [1, 2, 3].fold(0, (p, c) => p + c);
Run Code Online (Sandbox Code Playgroud)
mda*_*kin 10
我仍然认为对于这个特殊问题,显而易见的方法是更清晰,更容易理解.
num sum = 0;
[1, 2, 3].forEach((num e){sum += e;});
print(sum);
Run Code Online (Sandbox Code Playgroud)
要么
num sum = 0;
for (num e in [1,2,3]) {
sum += e;
}
Run Code Online (Sandbox Code Playgroud)
从 Dart 2.6 开始,您可以使用扩展在列表上定义实用方法。这适用于数字(示例 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;
}
}
Run Code Online (Sandbox Code Playgroud)
示例 1(对列表中的所有数字求和):
var numbers = [1, 2, 3];
var sum = numbers.sumBy((number) => number);
Run Code Online (Sandbox Code Playgroud)
示例 2(对所有 Point.x 字段求和):
var points = [Point(1, 2), Point(3, 4)];
var sum = points.sumBy((point) => point.x);
Run Code Online (Sandbox Code Playgroud)
现在使用核心库没有一种干净的方法,但是如果你使用自己的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;
}
Run Code Online (Sandbox Code Playgroud)
我和Dart团队讨论了将foldLeft添加到核心集合中的问题,我希望它很快就会存在.
我只想在 @tmaihoff 的答案中添加一些小细节(关于使用collection.dart包):
sum他谈到的吸气剂仅适用于可迭代的值num,例如List<int>or Set<double>。
如果您有表示值的其他对象类型的列表(例如Money、Decimal、Rational或任何其他),则必须将其映射到数字。例如,要计算字符串列表中的字符数,您可以执行以下操作:
// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].map((e) => e.length).sum;
Run Code Online (Sandbox Code Playgroud)
截至 2022 年,另一种方法是使用fast_immutable_collectionssumBy()包的方法:
// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].sumBy((e) => e.length), 15);
Run Code Online (Sandbox Code Playgroud)
注意:我是包的作者。
| 归档时间: |
|
| 查看次数: |
7286 次 |
| 最近记录: |