.在 Kotlin 中,reduce() 和 fold() 是函数式编程中常用的高阶函数。它们都是对集合中的元素进行聚合操作的函数,将一个集合中的元素缩减成一个单独的值。它们的使用方式非常相似,但是返回值略有不同。下面是它们的区别:
· reduce() 函数是对集合中的所有元素进行聚合处理,并返回最后一个合并处理值。
· fold() 函数除了合并所有元素之外,还可以接受一个初始值,并将其与聚合结果一起返回。注:如果集合为空的话,只会返回初始值。
fun reduceAdd() { val list = listOf(1, 2, 3, 4, 5) val sum = list.reduce { acc, i -> println("acc:$acc, i:$i") acc + i } println("sum is $sum") // 15 }
执行结果:
acc:1, i:2acc:3, i:3acc:6, i:4acc:10, i:5sum is 15
val strings = listOf("apple", "banana", "orange", "pear")val result = strings.reduce { acc, s -> "$acc, $s" }println(result) // apple, banana, orange, pear
执行结果:
apple, banana, orange, pear
val numbers = listOf(1, 2, 3, 4, 5)val sum = numbers.fold(10) { acc, i -> acc + i }println(sum) // 25
执行结果为:
acc:10, i:1acc:11, i:2acc:13, i:3acc:16, i:4acc:20, i:5sum is 25
val strings = listOf("apple", "banana", "orange", "pear")val result = strings.fold("Fruits:") { acc, s -> "$acc $s" }println(result) // Fruits: apple banana orange pear
执行结果:
Fruits: apple banana orange pear
public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S { val iterator = this.iterator() if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.") var accumulator: S = iterator.next() while (iterator.hasNext()) { accumulator = operation(accumulator, iterator.next()) } return accumulator}
从代码中可以看出,reduce函数接收一个operation参数,它是一个lambda表达式,用于聚合计算。reduce函数首先获取集合的迭代器,并判断集合是否为空,若为空则抛出异常。然后通过迭代器对集合中的每个元素进行遍历操作,对元素进行聚合计算,将计算结果作为累加器,传递给下一个元素,直至聚合所有元素。最后返回聚合计算的结果。
public inline fun <T, R> Iterable<T>.fold( initial: R, operation: (acc: R, T) -> R): R { var accumulator: R = initial for (element in this) { accumulator = operation(accumulator, element) } return accumulator}
从代码中可以看出,fold函数接收两个参数,initial参数是累加器的初始值,operation参数是一个lambda表达式,用于聚合计算。
fold函数首先将初始值赋值给累加器,然后对集合中的每个元素进行遍历操作,对元素进行聚合计算,将计算结果作为累加器,传递给下一个元素,直至聚合所有元素。最后返回聚合计算的结果。
阅读量:645
点赞量:0
收藏量:0