Kotlin | 高阶函数reduce()、fold()详解

简介: 在 `Kotlin` 中,`reduce()` 和 `fold()` 是函数式编程中常用的高阶函数。它们都是对集合中的元素进行聚合操作的函数,将一个集合中的元素缩减成一个单独的值。它们的使用方式非常相似,但是返回值略有不同

Kotlin 中,reduce()fold() 是函数式编程中常用的高阶函数。它们都是对集合中的元素进行聚合操作的函数,将一个集合中的元素缩减成一个单独的值。它们的使用方式非常相似,但是返回值略有不同。下面是它们的区别:

  • reduce() 函数是对集合中的所有元素进行聚合处理,并返回最后一个合并处理值。
  • fold() 函数除了合并所有元素之外,还可以接受一个初始值,并将其与聚合结果一起返回。注:如果集合为空的话,只会返回初始值。

reduce示例

1、使用 reduce() 函数计算列表中所有数字的总和:

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:2
acc:3, i:3
acc:6, i:4
acc:10, i:5
sum is 15

2、使用 reduce() 函数计算字符串列表中所有字符串的拼接结果:

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

fold示例

1、使用 fold() 函数计算列表中所有数字的总和,并在其基础上加上一个初始值:

val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(10) { acc, i -> acc + i }
println(sum) // 25

执行结果为:

acc:10, i:1
acc:11, i:2
acc:13, i:3
acc:16, i:4
acc:20, i:5
sum is 25

2、使用 fold() 函数将列表中的所有字符串连接起来,并在其基础上加上一个初始值:

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

源码解析

  • reduce()Kotlin标准库的实现如下:
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函数首先获取集合的迭代器,并判断集合是否为空,若为空则抛出异常。然后通过迭代器对集合中的每个元素进行遍历操作,对元素进行聚合计算,将计算结果作为累加器,传递给下一个元素,直至聚合所有元素。最后返回聚合计算的结果。

  • fold()Kotlin标准库的实现如下:
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函数首先将初始值赋值给累加器,然后对集合中的每个元素进行遍历操作,对元素进行聚合计算,将计算结果作为累加器,传递给下一个元素,直至聚合所有元素。最后返回聚合计算的结果。

总结

  • reduce()适用于不需要初始值的聚合操作,fold()适用于需要初始值的聚合操作。
  • reduce()操作可以直接返回聚合后的结果,而fold()操作需要通过lambda表达式的返回值来更新累加器的值。

在使用时,需要根据具体场景来选择使用哪个函数。

相关文章
|
2月前
|
存储 开发者 Kotlin
Kotlin Lambda表达式与标准库中的高阶函数
Kotlin Lambda表达式与标准库中的高阶函数
17 1
|
Java Kotlin
Kotlin中匿名函数(又称为Lambda,或者闭包)和高阶函数的详解
Kotlin中匿名函数(又称为Lambda,或者闭包)和高阶函数的详解
114 0
|
Java C++ Kotlin
【Kotlin】Kotlin 高阶函数 ( 高阶函数当做参数 | 高阶函数定义 | 高阶函数调用 )
【Kotlin】Kotlin 高阶函数 ( 高阶函数当做参数 | 高阶函数定义 | 高阶函数调用 )
131 0
|
Java Kotlin
Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......)
一、ForEach 类型于Java的传统的写法 package net.println.kotlin.chapter5.
10145 2
|
Kotlin
Kotlin常用的高阶函数(Filter、TakeWhile、Let、Apply、With......)
一、Filter package net.println.kotlin.chapter5.builtins /** * @author:wangdong * @description:Kotlin常见的高阶函数 */ fun main(args: Array) { //求(0.
2608 0
|
Kotlin
kotlin高阶函数开发一个程序,统计文本中字符串出现的个数
一、高阶函数是Kotlin的核心部分,下面来使用下高阶函数写一个程序 注意:我这里的File使用的是:与src同级的文件,你可以根据自己的需要,修改文件地址 代码实例 package net.
1337 0
|
Kotlin
Kotlin高阶函数概念
一、高阶函数的基本概念 1.传入或者返回函数的函数(传入是函数,返回也是函数) 2.函数引用最常见的方式,”:: println” 3.
923 0
Kotlin 中 有趣 好玩的高阶函数
package com.easy.kotlin // 简单好用的 Kotlin 类型别名, 我们使用 G,F,H 声明了3个函数类型(有点类似Java 中的接口类型的概念) typealias G = (String) -> Int typealia...
1193 0
kotlin极简教程 高阶函数 函数式编程章节节选
kotlin极简教程 高阶函数 函数式编程章节节选 KotlinChina编程社区 微博 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 点击这里 > 去天猫商城购买阅读 非常感谢 if (boy) { 帅气英俊潇洒} else { 魔鬼身材天使脸蛋美丽动人女神气质} 的您。
1059 0