Kotlin高阶函数reduce与fold使用实例

作者:-小马快跑- 时间:2023-04-27 22:17:11 

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

来源:https://blog.csdn.net/u013700502/article/details/130278079

标签:Kotlin,reduce,fold
0
投稿

猜你喜欢

  • SpringBoot整合liquibase及liquibase生成初始化脚本的方式

    2023-07-29 11:53:18
  • java实现图片上传至本地实例详解

    2023-06-09 03:49:18
  • Java代码块与代码加载顺序原理详解

    2023-06-03 12:56:42
  • springboot如何通过@PropertySource加载自定义yml文件

    2022-08-06 19:42:56
  • Springboot日志开启SLF4J过程解析

    2022-04-23 01:29:57
  • Java编程枚举类实战代码分享

    2023-10-16 09:36:51
  • Kotlin协程概念原理与使用万字梳理

    2023-03-28 21:29:32
  • springdata jpa使用Example快速实现动态查询功能

    2022-12-01 21:49:08
  • 详解Java的MyBatis框架和Spring框架的整合运用

    2022-09-19 19:22:20
  • Java 中的HashMap详解和使用示例_动力节点Java学院整理

    2022-06-10 18:08:51
  • Java开发完整短信验证码功能的全过程

    2023-05-05 15:35:24
  • Java代理模式实例详解【静态代理与动态代理】

    2023-04-27 08:18:51
  • Java 替换word文档文字并指定位置插入图片

    2023-08-12 22:02:25
  • js+java实现登录滑动图片验证

    2022-02-21 21:17:17
  • 详解C#中的System.Timers.Timer定时器的使用和定时自动清理内存应用

    2022-11-07 14:09:54
  • Java使用Scanner类进行控制台输入实现方法

    2021-08-08 18:34:26
  • C#实现利用Windows API读写INI文件的方法

    2023-03-16 01:23:06
  • Kotlin语言编程Regex正则表达式实例详解

    2023-06-22 02:06:29
  • SWT(JFace)体验之打开多个Form

    2021-11-29 03:19:15
  • flutter轮子计划之进度条

    2023-06-21 07:59:39
  • asp之家 软件编程 m.aspxhome.com