scala - 基础:Scala fold, foldLeft, foldRight

说明

  1. 从本质上来讲,fold方法读取一种数据,然后返回给你另外一种。
  2. fold和foldLeft和foldRight做的事同样的事情,仅有一点点不同。

fold

val numbers = List(1, 2, 3, 4, 5)
val res = numbers.fold(10) { (z, i) => z + i }
// res = 25

List对象的fold方法,需要两个参数

  1. 开始值,上面写的是10。
  2. 一个function,这个function也需要两个参数。列表中的累计值z,列表中的当前值i。

所以,在执行开始时,10作为第一个参数传递给函数,z = 10。列表中的第一项(也可能是第二项或者其他项,无须)作为第二个参数传递给函数,i = 1。

然后函数应用于它的两个参数,10 + 1,然后返回一个结果。

然后,Fold将前面的返回值作为函数的第一个参数,并将列表中的下一个项目作为第二个参数,然后应用它,返回结果。

这个过程对列表中的每个项目重复执行,并在遍历列表中的所有项目之后返回函数的返回值。

foldLeft

package info.aoye
class Foo(val name: String, val age: Int, val sex: Symbol)
object Foo {
def apply(name: String, age: Int, sex: Symbol) = new Foo(name, age, sex)
}
object Test {
def main(args: Array[String]): Unit = {
val fooList = Foo("Hugh Jass", 25, 'male) ::
Foo("Biggus Dickus", 43, 'male) ::
Foo("Incontinentia Buttocks", 37, 'female) ::
Nil
val stringList = fooList.foldLeft(List[String]()) { (z, f) =>
val title = f.sex match {
case 'male => "Mr."
case 'female => "Ms."
}
z :+ s"$title ${f.name}, ${f.age}"
}
// List(Mr. Hugh Jass, 25, Mr. Biggus Dickus, 43, Ms. Incontinentia Buttocks, 37)
}
}

三个方法之间的区别

  1. 本质的功能没什么区别。
  2. foldLeft 是从左向右开始遍历,foldRight是从右向左开始遍历,fold的是无须的的遍历。
posted @   duchaoqun  阅读(972)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示