Scala 高阶函数(二)

news2025/1/16 1:59:31

一、scala自带高阶函数

概述:可以接收一个函数的函数就是高阶函数,又称为算子

1。map:

将集合中的每一个元素通过指定功能(函数)映射(转换)成新的结果集

val list1 = List(1,2,3)
val list2 = list1.map(v=>v*2)
println(list2)			//List(2, 4, 6)

2.flatten

介绍:flat即压扁,压平,扁平化。效果就是将集合中的每个元素的子元素映射到某个函数并返回新的集合

var list = List(List(1,2,3),List(3,4,5))
val list2 = list.flatten
println(list2)          // 输出结果:List(1, 2, 3, 3, 4, 5)

val list3 = List(Array("zhangsan","lisi"),Array("lisi","wangwu"))
println(list3.flatten)

3.flatMap

介绍:先执行map,在执行flatten

var list = List("zhangsan lisi","lisi wangwu","wangwu wangwu")
val list2 = list.flatMap(v=>v.split(" "))
println(list2)    //输出:List(zhangsan, lisi, lisi, wangwu, wangwu, wangwu)

4.filter (过滤器)

介绍:将符合要求的数据,通过指定函数的筛选放置到新的集合中
需求:将集合中首字母为‘A’的筛选到新的集合

var list = List("Alice","Tom","Jack","Abc")
val list2 = list.filter(v => {
   v.startsWith("A")
})
println(list2)			//输出结果:List(Alice, Abc)

5.reduce

介绍:对集合中的元素进行归约操作
需求:计算List集合中所有元素的和

var list = List(1,2,6,8)
val i: Int = list.reduce((v1,v2)=>v1+v2)
println(i)

6.fold

介绍:fold函数将上一步返回的值作为函数的第一个参数继续传递参与运算
需求: 计算List集合中所有元素的和

var list = List(1,2,6,8)
val i: Int = list.fold(5)((v1, v2) => {
      v1 + v2
})
println(i)

上述代码等同于
list(5,1,2,6,8).reduce((v1, v2) => {
      v1 + v2
})

7.sorted

介绍:对集合中的元素进行排序

var list = List(1,13,4,34)
println(list.sorted)            	//输出结果 List(1, 4, 13, 34)
println(list.sorted.reverse)		//输出结果 List(34, 13, 4, 1)

8.sortBy

介绍:对集合中元组的某个元素进行排序

//List集合中存储一个学生的信息,分别是姓名和语文成绩,请按照语文成绩排序
var list = List(("张三",100),("李四",84),("王五",95),("赵六",30))
println(list.sortBy(t => t._2))			//List((赵六,30), (李四,84), (王五,95), (张三,100))
println(list.sortBy(t => t._2).reverse) //List((张三,100), (王五,95), (李四,84), (赵六,30)


//List集合中存储一个学生的信息,分别是姓名和语文成绩、数学成绩
//请按照语文成绩先排序,语文成绩相等者,按照数学成绩排序
var list2 = List(("张三",100,58),("李四",84,96),("王五",84,75),("赵六",30,61))
println(list2.sortBy(v => (v._2, v._3))(Ordering.Tuple2(Ordering.Int,Ordering.Int.reverse)))

//输出结果:List((赵六,30,61), (李四,84,96), (王五,84,75), (张三,100,58))

9.groupBy

介绍:根据集合中包含元组进行分组

var list = List(("张三",100),("张三",96),("李四",84),("李四",30))
//.groupBy(v=>v._1) 作用:根据遍历集合获取元组的第一个元素进行分组
val map: Map[String, List[(String, Int)]] = list.groupBy(v=>v._1)
println(map)

10.foreach

介绍:遍历集合中的元素

 var list = List("张三","李四","王五")list.foreach(v=>{
    println(v)
    })

11.关于高阶函数的形参(匿名函数)的写法

val list = List(1,2,3)
1.正常的写法
  list.map( (v:Int) => v*2 )
  
2.如果可以正常推断出匿名函数的形参类型,则:Int可以省略
  list.map( (v) => v*2 )
  
3.如果匿名函数的形参个数只有1个,则()小括号可以省略
  list.map( v => v*2 )
  
  list.reduce( (v1,v2) => v1+v2 )    //此处(v1,v2)对应的小括号不能省略

4.如果匿名函数的形参(每一个),在匿名函数的代码体中只出现一次,则可以将形参列表和=> 省略,并且在函数体中使用_代表形参
  list.map( v => v*2  )   对应简写  list.map( _*2  )
  list.map( v => v*v )    不能使用_简写
  
  list.reduce( (v1,v2) => v1+v2 )  对应简写   list.reduce( _+_ )

二、高级函数

1.闭包

闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数

介绍: 闭包就是一个函数和与其相关的引用环境组合的一个整体

def minus(x:Int)= (y:Int)=> x-y

val f1 = minus(20)   //此处的f1就是闭包
f1(1)  //输出19
f1(2)  //输出18

详解:
①  (y:Int)=> x-y 
     代表minus这个函数的返回值是一个匿名函数,那么将来这个匿名函数执行时就需要引入外部环境变量x
     这就形成了闭包
②  当多次调用f(可以理解多次调用闭包) 发现使用的是同一个x,所以x不变
③  在使用闭包时,主要搞清楚返回函数引用了函数外的哪些变量,因为他们会组合成一个整体

2.函数柯里化

介绍:函数编程中,接受多个参数的函数都可以转化为接收单个参数的函数,这个转化过程就叫柯里化
柯里化就是证明了函数只需要一个参数而已,不用设立柯里化存在的意义这样的命题。柯里化就是以函数为主体这种思想发展的必然产生结果
需求:编写一个函数,接收两个整数,可以返回两个数的乘积

//常规方式完成
def test1(v1:Int,v2:Int)={
    v1+v2
}
test1(10, 20)

//闭包
def test2(x:Int)= (y:Int)=>x+y
test2(10)(20)

//柯里化
def test3(x:Int)(y:Int)={
    x+y
}
test3(10)(20)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[第十二届蓝桥杯/java/算法]D——相乘

🧑‍🎓个人介绍:大二软件生,现学JAVA、Linux、MySQL、算法 💻博客主页:渡过晚枫渡过晚枫 👓系列专栏:[编程神域 C语言],[java/初学者],[蓝桥杯] &#x1f4d6…

C#获取计算机硬件的参数信息

2019年的时候用PowerBuilder写过一个计算机信息收集小程序,《计算机信息收集小程序》,当时是查注册表来实现的。 还可以通过对windows的API调用来做,这个稍微有点麻烦。 使用C#也可以通过三种方式来实现,分别是读取注册表、window…

import语句写烦了,怎么办?

每次写数据相关的代码时都会习惯性地先写一堆import语句,不管用得到用不到,先在文首默一遍再说。 或者: ❞虽说CtrlC和CtrlV也很方便,但是每次都要先“抄一次”也很烦。 那么有没有什么好的解决办法? Python有一个模…

《码出高效:java开发手册》六-数据结构与集合(一)

前言 本章主要是讲数据结构与集合,这章内容涉及到非常基础的知识,内容相对较多,首先从数组讲起,引申到集合框架,之后再到集合源码,最后介绍了高并发集合框架 集合 集合在代码中是collection,…

智牛股_第8章_Sentinel

智牛股_第8章_Sentinel 文章目录智牛股_第8章_Sentinel学习目标第1章 Sentinel集成使用1. 目标2. 步骤3. 实现3.1 生产环境最优配置方案3.2 用户服务集成3.3 熔断规则配置3.4 启动Sentinel监控台3.5 功能使用验证4. 总结第2章 用户注册功能1. 目标2. 步骤3. 实现3.1 用户注册流…

flstudio21版本有什么新功能及免费新插件

全能数字音乐工作站(DAW)编曲、剪辑、录音、混音,23余年的技术积淀和实力研发,FL Studio已经从电音领域破圈,成功蜕变为瞩目的全能DAW,把电脑变成全功能音乐工作室,接下来我们会为您一一展示 2…

Prometheus Operator实战—— Prometheus、Alertmanager、Grafana 监控RockectMq

1. RocketMQ 介绍 RocketMQ 是一个分布式消息和流数据平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。简单的来说,它由 Broker 服务器和客户端两部分组成,其中客户端一个是消息发布者客户端(Producer),它负责向…

硬盘恢复工具软件哪个好?分享这些硬盘数据恢复工具软件

您刚刚删除了一些非常重要的文件! 不要惊慌……您仍然有很大的机会可以以很少甚至免费的方式取回它们。 我们正在深入研究当今最好的硬盘恢复软件。 我们认为有一个明显的赢家,但我们提供了一些其他选项,以防您需要更高级的功能或使用不同…

四、网络层(三)IPv4

目录 3.1 IPv4地址 3.1.1分类编址 3.1.2子网划分与子网掩码 3.1.3无分类编址CIDR 3.1.4网络地址转换(NAT) 3.2 IPv4分组 3.2.1 IP分组(IP数据报)的格式 3.2.2 IP数据报分片 3.3 地址解析协议(ARP&am…

计讯物联二次供水水池泵站监测方案,从根本上保障居民饮用水安全

水质污染、设施故障率高、供水压力、安防缺失、故障反馈周期长等城市高楼大厦高层供水问题层出不穷,给二次供水安全带来隐患和威胁。为确保高层住宅安全稳定地进行二次供水,计讯物联利用新一代物联网技术、信息技术、云计算、大数据、数字孪生技术等先进…

ESP32中micro-ROS与ROS2通信(点亮esp32指示灯)

前言 micro-ROS,是基于ROS2进行优化的一套轻量级ROS系统,它提供了完全部署的ROS 2生态系统的大多数吸引人的工具和功能,并具有入式和低资源设备的卓越能力,可以运行在MCU硬件平台。 传统上,即使机器人包含许多ROS&am…

视频号直播间首次突破1万人

我是卢松松,点点上面的头像,欢迎关注我哦! 12月21直播结束后,看了下直播数据,竟然有100多人在线时长达到了1小时以上。看来直播间用户的粘性越来越强了,固定用户越来越多。个人做直播已经2年了&#xff0c…

聚观早报 | 马斯克或将卸任推特CEO;小米内部人士回应年底裁员

今日要闻:马斯克或将卸任推特CEO;小米内部人士回应年底裁员;微软或将于明年收购Netflix;奥迪正逐步淘汰燃油车;支付宝开通健康防疫专区马斯克或将卸任推特CEO 自今年 10 月份入主推特以来,马斯克一系列大刀…

[洛谷]【深基16.例3】二叉树深度

一、题目描述 题目描述 有一个 n(n≤106)n(n \le 10^6)n(n≤106) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 nnn),建立一棵二叉树(根节点的编号为 111),如果是叶子结点,则输入 …

实测 | 海纳百川,华为OceanStor Pacific分布式存储为多元算力应用带来更优选择...

被称为开眼看世界的林则徐,在自己的书房中写了这样一副对联,以做自勉:海纳百川,有容乃大,壁立千仞,无欲则刚。包容的胸怀是我们做成很多事情的根基,也是一项产业战略、科技事业发展的关键。近几…

数据开源 | Magic Data开源基于ChatGPT的可扩展的对话数据集

在过去的一月里,人工智能领域中最火的话题莫过"ChatGPT"。ChatGPT是OpenAI于11月30日发布最新作品聊天机器人,开放公众免费测试。聊天机器人是一种软件应用程序,根据用户的提问做出回应、模仿人类的对话方式。目前,Chat…

做好程序中的axios错误提示

今天外包组的项目客户反馈老是出错,一看页面卡在加载数据过程中,前后台分离之后,页面变得很奇怪,脸面都出来了,就是没有具体值。 初级程序员在很长一段时间要经历一个升级过程,写的程序首先是写画面&#…

散户如何进行开展量化股票交易的?

散户如何进行开展量化股票交易的?也就是投资者交易的条件,达到了投资者设定的条件时候,系统接口就会自动交易,下面来看看具体的流程: 依据个股的历史记录,进行多因子选股,比如,把市…

Rasa 基于知识库的问答 音乐百科机器人

文章目录1. 使用 ActionQueryKnowledgeBase创建知识库NLU数据2. 音乐机器人nlu.ymlstories.ymlrules.ymldomain.ymlconfig.ymlendpoints.ymldata.json自定义动作 actions.py测试使用Neo4jlearn from https://github.com/Chinese-NLP-book/rasa_chinese_book_code 机器人返回了…

从“小螺栓血案”谈装配体模型连接螺栓6个正确的处理方法

经调查发现:“江苏启安建设工程有限公司提供了支吊架膨胀螺栓计算书,但计算书上无企业相关人员签字,未经监理单位审核同意,未报施工总包单位,未经设计单位审定;计算书认为支吊架应采用直径为12mm 的膨胀螺栓…