fold 方法会从 初始值(一个累加器)开始,依次遍历列表中的元素,并按照你提供的函数进行累计计算,最终返回一个结果。
R fold<R>(
R initialValue,
R combine(R previousValue, E element)
)
initialValue:初始值(累加器的起点)。combine:函数,接收两个参数:previousValue:上一次计算后的累加器值element:当前遍历到的元素
并返回一个新的累加器值。
- 返回值:最终的累计结果。
求和:
void main() {
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.fold(0, (prev, element) => prev + element);
print(sum); // 15
}
执行过程:
- 初始值
prev = 0 - 第1次:
prev = 0 + 1 = 1 - 第2次:
prev = 1 + 2 = 3 - 第3次:
prev = 3 + 3 = 6 - 第4次:
prev = 6 + 4 = 10 - 第5次:
prev = 10 + 5 = 15
拼接字符串
void main() {
var words = ['Hello', 'Dart', 'Fold'];
var sentence = words.fold('', (prev, element) => prev + element + ' ');
print(sentence.trim()); // "Hello Dart Fold"
}
统计字符串长度总和
void main() {
var words = ['a', 'bb', 'ccc'];
var totalLength = words.fold(0, (prev, element) => prev + element.length);
print(totalLength); // 6
}
转换成 Map
void main() {
var words = ['apple', 'banana', 'apple', 'orange'];
var freq = words.fold<Map<String, int>>({}, (map, word) {
map[word] = (map[word] ?? 0) + 1;
print("map[$word]: ${map[word]}");
return map;
});
print(freq); // {apple: 2, banana: 1, orange: 1}
}
// I/flutter (20487): map[apple]: 1
// I/flutter (20487): map[banana]: 1
// I/flutter (20487): map[apple]: 2
// I/flutter (20487): map[orange]: 1
// I/flutter (20487): {apple: 2, banana: 1, orange: 1}