Scala的foldLeft与foldRight详解

foldLeft与foldRight是特质TraversableOnce定义的高阶函数,直译过来为向左折叠和向右折叠。具体实现如下摘出的代码所示:

trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {@deprecated("Use foldLeft instead of /:", "2.12.10")def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)@deprecated("Use foldRight instead of :\\", "2.12.10")def :\[B](z: B)(op: (A, B) => B): B = foldRight(z)(op)// 泛型为B,第一个参数z为B类型对象(初始值),第二个参数为返回类型为B的函数def foldLeft[B](z: B)(op: (B, A) => B): B = {//  初始值z赋值为result变量var result = z// 遍历当前类对象集合,将result变量与集合取出的每个对象作为参数传递给op函数,// 每迭代一次op函数的返回值都赋给result变量this foreach (x => result = op(result, x))// 最终获取result作为返回值result}// 从后往前遍历集合,初次结果为z,然后把遍历对象和上次结果传给函数,如此迭代下去直到集合遍历完毕。def foldRight[B](z: B)(op: (A, B) => B): B =reversed.foldLeft(z)((x, y) => op(y, x))protected[this] def reversed = {var elems: List[A] = Nilself foreach (elems ::= _)elems}
}

foldLeft

通过不断迭代来得到结果的过程,首先把第一个参数作为结果,然后从开始遍历集合,上次结果与本次遍历的对象作为参数传递给第二个参数代表的函数,得到的结果与再次遍历的对象再次作为参数传递给函数,如此一直迭代下去,集合遍历结束 后的结果就是最终返回的结果。

举例来看:

val seq = Seq(1,2,3)
seq.foldLeft(0)(_-_)

运行步骤:
① res1 = f(0,1) => 0 - 1 == -1 【 初始值 0 - 遍历集合第一个值 1 = 结果 -1 】
② res2 = f(-1,2) => -1 - 2 == -3 【 上步结果 -1 - 遍历集合第二个值 2 = 结果 -3】
③ res3 = f(-3,3) => -3 - 3 == -6 【 上步结果 -3 - 遍历集合第三个值 3 = 结果 -6】
在这里插入图片描述

/: 是 foldLeft 的另一只写法,从scala版本2.12.10开始被弃用了,可能在老代码里遇到。

val seq = Seq(1,2,3)
(0/:seq)(_-_)

在这里插入图片描述

foldRight

对集合从后往前遍历,首先把第一个参数作为结果,然后把本次遍历的对象与上次结果作为参数传递给第二个参数代表的函数,得到的结果后,再重复上述步骤直到集合遍历结束,遍历结束后的结果就是最终返回的结果。

举例来看:

val seq = Seq(1,2,3)
seq.foldRight(0)(_-_)

运行步骤:
① 先反转集合的到 Seq(3,2,1)
① res1 = f(3,0) => 3 - 0 == 3 【遍历集合第一个值 3 - 初始值 0 = 结果 3 】
② res2 = f(2,3) => 2 - 3 == -1 【遍历集合第二个值 2 - 上步结果 3 = 结果 -1】
③ res3 = f(1,-1) => 1 - (-1) == 2 【遍历集合第三个值 1 - 上步结果 -1= 结果 2】
在这里插入图片描述

:\ 是 foldRight 的另一只写法,从scala版本2.12.10开始被弃用了。

val seq = Seq(1,2,3)
(seq:\0)(_-_)

在这里插入图片描述
foldRight理解起来要绕一些,可以多找几个例子练习,加深理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/6011.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小波变换笔记

突然变化的图像或信号 小波变换 高带宽? 放缩和时延 放缩因子和频率成正比 小波在频域中具有带通特性 Cf 中心频率 s 小波刻度 \delta t 采样间隔 时延 我们需要移动小波,以便使其和信号中寻找的特征对齐 时频分析时域频率成分滤波 连续小波变换 C…

iview tree树形控件多选,自定义内容

项目中需要一个iview框架的树形控件,需要里面包含以下功能 1、控件宽度可展开,可缩小2、树形控件可搜索,并且定位到搜索的节点3、控件可以一键勾选,一键取消4、控件图标自定义5、 点击最后一个节点时可以进入到二级节点,点击上一节点可返回完整代码:listToTree文件 效果图: 具…

剑指 Offer 数组中数字出现的次数

⭐️ 题目描述 🌟 leetcode链接:数组中数字出现的次数 ⭕️ 代码: /*思路:有两个出现单次的数字,其余数字都出现两次。把所有的数字分成两组,这两个数组分到不同的组,异或起来,就可…

AI绘画StableDiffusion:云端在线版使用笔记分享(Kaggle版)

玩AI绘画(SD),自己电脑配置不够?今天给大家介绍一下如何baipiao在线版AI绘画StableDiffusion。 Kaggle 是世界上最大的数据科学社区,拥有强大的工具和资源,可帮助您实现数据科学目标。(每周可以…

云原生之深入解析如何在Kubernetes下快速构建企业级云原生日志系统

一、概述 ELK 是三个开源软件的缩写,分别表示 Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个 FileBeat,它是一个轻量级的日志收集处理工具 (Agent),Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输…

学习系统编程No.24【深入学习信号】

引言: 北京时间:2023/6/13/19:07,伴随着期末考的来临,最近停课啦!无论是线上课,还是学校的课,开心,那这不是咱持续更文的好时候嘛,但是今天在学习相关C知识时&#xff0…

IDEA新建Spring Boot项目

新建项目之前已经将JDK环境变量啥的都安装好了,本文只有新建。 1.打开idea,选择Create New Project。如果已经打开其他项目,点击File->New->Project,也可以打开新建的界面。 2.点左侧的Spring Initializr然后如图&#xff…

云原生之使用Docker部署Dashy个人导航页

云原生之使用Docker部署Dashy个人导航页 一、Dashy介绍1.1 Dashy简介1.2 Dashy特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、部署前准备工作4.1下载Dashy源码包4.2 查看D…

Ubuntu18.04安装Qt5.14.2

一、安装 第一步: 官网Index of /archive/qt 下载安装包, 或者国内网址下载 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.0/ 我安装的是QT5.14.2 中的 qt-opensource-linux-x64-5.14.2.run ; 第二步:ctrlT 打开终端输入命…

Linux--重定向:> >> <

输出重定向&#xff1a;> a.如果目标文件不存在&#xff0c;则创建文件。反之 b.本来应该显示到显示器的内容&#xff0c;被写入到了文件中 示例&#xff1a; 追加重定向: >> 示例&#xff1a; 输入重定向&#xff1a;< 本来应该从键盘中读取的内容&#xff0c;变…

node ffmpeg jsmpeg 拉流 展示笔记

拉流参考上一篇 基础&#xff1a;FFmpeg安装过 拉流完成之后转换成可播放的方式 1、下载jsmpeghttps://github.com/phoboslab/jsmpeg 下载完 用vscode 打开jsmpeg-master目录 2、在根目录下安装 node-media-server npm install node-media-server 新建app.js并运行 const…

Java代码实现OPC UA Client直接与PLC通讯

介绍 在现代制造业中&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;被广泛应用于控制工厂设备和流程。而OPC UA&#xff08;OLE for Process Control Unified Architecture&#xff09;则成为了工业自动化领域中的通信协议标准。本教程将教你如何使用Java编写一个O…