scala要点总结3:函数式编程_scala函数式编程的实验总结-程序员宅基地

技术标签: scala  spark  

Scala combines object-oriented and functional programming in one concise, high-level language.

这是Scala官网介绍scala的第一句话,可以发现Scala的两大利器:更加纯粹的面向对象和函数式编程。

如果说面向对象让构造大型系统更加便捷,那么函数式编程则会让功能的实现更加快速,极大的提高编程效率。

高阶函数是指参数是函数,Scala主要应用是各种算子;或者返回的是函数,Scala中主要应用是柯里化。

 

一:常用算子

val list = List(4, 5, 6, 1, 2, 3)

1. map

// map用于对集合中的所有元素进行操作,eg 所有元素*2
val list1 = list.map(_ * 2)
list1: List[Int] = List(8, 10, 12, 2, 4, 6)

2. filter

// filter 用于过滤符合特定条件的元素,eg 只留下偶数
val list2 = list.filter(_ % 2 == 0)
list2: List[Int] = List(4, 6, 2)

3. sorted

// 排序
val list3 = list.sorted
list3: List[Int] = List(1, 2, 3, 4, 5, 6)

4. reverse

// 反转
val list4 = list3.reverse
list4: List[Int] = List(6, 5, 4, 3, 2, 1)

5. grouped

// 分组, eg 2个一组分组
val list5 = list.grouped(2)
ArrayBuffer(List(4, 5), List(6, 1), List(2, 3))
list5: Iterator[List[Int]] = <iterator>

6. flatten

// 压平,用于将多个集合压成一个
val list6 = list5.flatten
ArrayBuffer(4, 5, 6, 1, 2, 3)
list6: Iterator[Int] = <iterator>

7. flattenMap

// flatten 和 map 的整合
val list7 = List("stay foolish", "stay hungry")
val list8 = list7.flatMap(_.split(" "))
list8: List[String] = List(stay, foolish, stay, hungry)

8. reduce

// 规约操作 (((((4+5)+6)+1)+2)+3)
// 两个_依次被填补集合中的数值
val v9 = list.reduce(_ + _)
list9: Int = 21

9. fold

// 折叠, 第一个参数事初始值,注意并行情况下,可能会随着使用线程数量的不同出现不同的值
val v10 = list.fold(0)(_ + _)
v10: Int = 21
val v11 = list.par.fold(10)(_ + _)

10. aggregate

// 聚合,第一个参数事初始值,第二个入参包含两个函数,第一个是实现局部(各自分区)聚合的函数,第二个是整体聚合的函数
// _ + _.sum 的第一个 _ 表示初始值,第二个_代表子List。第二个函数和reduce,fold 一样
val v11 = list5.aggregate(0)(_ + _.sum, _ + _)
v11: Int = 21

11. 实践:wordCount

object a {
  def main(args: Array[String]): Unit = {
    val text = "welcome to zhanhtTect blog, stay Hungary, stay Foolish"
    // 拿到单词
    val words = text.split(",").flatMap(_.trim.split(" "))
    // 单词计数1
    val wordNum = words.map((_, 1))
    // 按照单词进行聚合
    val sum = wordNum.groupBy(_._1)
    val result = sum.mapValues(_.size)
    print(result)
  }
}

二:柯里化

柯里化指将接受多个参数的函数转换为接受一个参数,它可以帮助类型推断,提高方法的效率。

// 普通sum函数
def sum(a : Int, b : Int) = a + b

// Currying sum 写法1
def curringSum1(a : Int)(b : Int) = a + b

// Currying sum 写法2
// 这种写法也能直观的表明,柯里化实现过程起始是掉用两次普通函数
// 第一次使用第一个参数,返回一个单参数的函数,在使用第二个参数,返回最终结果
def curringSum2(a : Int) = (b : Int) => a + b
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhanht/article/details/89048386

智能推荐

mac os 录屏快捷键_Micro Snitch——Mac防监控软件-程序员宅基地

想要一款Mac防监控软件吗?Micro Snitch 破解版带给大家,micro snitch mac版是一款实时显示你电脑摄像头和麦克风状态的Mac防监控软件,以让用户察觉它们是否正在被使用,这种超轻型的菜单栏应用程序,它会静默地在后台运行。同时,它始终监视且报告任何摄像头和麦克风的活动,以帮助你找到是什么在监察你。功能菜单栏图标当前麦克风或摄像头的任何活动都会显示在菜单栏中。菜单还会显示连接的..._mac 快捷键 监控

程序员职场生活记录分享——初次面试感概-程序员宅基地

一、简单说两句十月霜侵季子裘,吾诗又送一年秋,嗯,十月。随着时间的流失,小编,依然还是那个青春懵懂的小编,哈哈哈哈~~在写博客这段时间里,认识了许多的小伙伴,也习惯了每个工作日早晨第一件事就是打开浏览器搜索csdn,了解技术发展的一个趋势。小编专业:java , 担任职位:java开发工程师,哪里人:湖南人。二、专栏目的目的?当然是骗你们点进来涨涨涨涨涨访问量呀,既然进来不...

(ARM学习)u-boot ,Linux内核,文件系统的移植到jz2440开发板-程序员宅基地

Linux启动流程硬件上电后,会先启动Bootloader, Bootloader再引导Linux内核,Linux内核挂载文件系统,Linux系统启动完成。BootloaderBootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。Bootloader有...

日志框架:Log4j_lombok.extern.log4j是那个日志框架-程序员宅基地

Log4j第一步:加入Maven依赖<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>第二步:在项..._lombok.extern.log4j是那个日志框架

@RequestParam接收axios的post方式传递数据时的坑_post请求参数中有参数但是@requestparam报错-程序员宅基地

后端使用@RequestParam来接收参数,前端用axios的post方式传数据。但是一直报错400,请求无效。@RequestParam接收的请求头格式为:application/x-www-form-urlencoded开始以为是post没有配置content-Type请求头,然而我已经配置了。后来几经Google才发现,post传参的默认格式是json格式,所以才会一直报错。然后引入..._post请求参数中有参数但是@requestparam报错

随便推点

Windows10下bash: make: command not found_windows make: command not found-程序员宅基地

在服务器上测试模型的速度,gpu都快被别人沾满了,测得结果可能不太准确,在本地win10系统配置环境运行的时候报错:$ makebash: make: command not found解决方法:1.安装MinGW2.下载make-4.2.1-without-guile-w32-bin.zip,下载网址 将内容复制到你安装的git目录下 D:Git \ mingw64 \合并文件夹,但不要覆盖/替换任何现有文件。然后就OK了,有的可能不太好下载,多刷新。。问题解决。参考链接:https_windows make: command not found

OSI及tcp/ip参考模型层次结构-程序员宅基地

OSI参考模型层次结构1,物理层:定义电压、接口、线缆标准、传输距离等协议标准2, 数据链路层的功能:• 编帧和识别帧• 数据链路的建立、维持和释放• 传输资源控制• 流量控制• 差错验证• 寻址• 标识上层数据• 局域网数据链路层分为LLC子层和MAC子层• 广域网常见协议:PPP、HDLC、FR3,网络层• 编址• 路由• 拥塞控制• 异种网络互连4,传输层功能:• 分段上层数据• 建立端到端连接• 透明、可靠传输• 流量控制• 传输层协议:• 主要有TC

ubuntu rsync 命令拷贝,显示进度_ubuntu查看拷贝进度_linzhiji的博客-程序员宅基地

参考Rsync基本使用#-r, --recursive 对子目录以递归模式处理#-t, --times 保持文件时间信息#-v, --verbose 详细模式输出#--progress 显示备份过程rsync -rtv --progress diskd/ movie/-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于 -rlptgoD-v, --verbose 详细模式输出-z, --compress 对备份的文件在传输时进行压缩处._ubuntu查看拷贝进度

SQL Server Management Studio 使用方法手记-程序员宅基地

至此我们就建好了一个名称为“SNC”的数据库,架构是“dbo(databse owner)”的数据表“dbo.Test”,然后我们就可以写app来测试了,下节将分享一个用C# 写的操作“SQL Server”控制台程序。填写好列名、数据类型和是否允许null值,保存即可,本方法只记录自己的操作方法,仅供参考。输入数据库名称即可,其它默认。_sql server management studio

解决使用Microsoft Graph OAuth获取令牌时,没有refresh_token的问题_password模式获取令牌没有refresh_token-程序员宅基地

解决使用Microsoft Graph OAuth获取令牌时,没有refresh_token的问题_password模式获取令牌没有refresh_token

Vue导入项目后,npm i后显示node-sass出错_code 1 npm err! path f:\jtyh\jtyh-user-fr\node_mod-程序员宅基地

报错:npm ERR! code 1 npm ERR! path D:\node_modules\node-sass问题原因:nodejs本身版本会影响到下载的node-sass的版本,node的版本对应着node-sass的版本可下载区间。我们个人使用的nodejs版本过高,导致下载的node-sass版本过高。无法迎合项目中4.12.0版本的node-sass。版本对应及下载路径:以往的版本 | Node.js解决方案: 1.卸载电脑高版本nodejs,可通过控制面板来卸载,并删.._code 1 npm err! path f:\jtyh\jtyh-user-fr\node_modules\node-sass npm err! co