Scala高阶函数

2023-11-14

匿名函数

而在大量的spark中大都用的是匿名函数(不为函数命名),然后将其复制个一个变量。

如:
这里写图片描述

 匿名函数格式:
Val 变量名 = (参数:类型) => 函数体

高阶函数

函数参数

1.将函数做参数传给另一个函数

如:
这里写图片描述

  • 首先我们定义了一个函数BigData,这个函数有两个参数,第一个参数是一个函数,函数名是func,他有一个String类型的参数并且返回值是unit空的;第二个参数是String类型的变量名为content的变量,函数体是将第二个参数作为第一个参数也就是函数func的参数,来调用第一个函数,整个函数返回值为unit空。这里只要传入的函数的格式与定义的一致就行。
    又如:

这里写图片描述

  • Array.map()作用,他会遍历array中每一个元素,并将每个元素作为具体的值传给map中的作为参数的函数。
2.函数的返回值是函数

这个函数也是一样,只要理解了返回值是类型一个匿名函数就行了。

def addBy(factor:Int) = {
  (x:Double)=> factor + x
}

(x:Double) 是返回函数的参数定义,返回类型由表达式 factor +x 来决定。如果表达式比较复杂,也可以如下写法

(x:Double)=> { do some things }

我们看看如何调用函数

package com.dt.scala.hello
import scala.math._
object ScalaInAction {
    def addBy(factor:Int) = {
      (x:Double)=> factor + x
    }  //> addBy: (factor: Int)Double => Double
 
    val addFive = addBy(5) //> addFive  : Double => Double = <function1>
    println(addFive(20)) 

柯里化

柯里化指的是将原来接受两个参数的方法变成新的接受一个参数的方法的过程

这里写图片描述


代码

object CurringFuncTest { def main(args: Array[String]): Unit = { //正常定义1 def multiple1(x:Int,y:Int) = x*y println(multiple1(2,3)) //其中一个函数作为返回值 def multiple2(x:Int)=(y:Int)=>x*y println(multiple2(3)(4)) //柯里化 def multiple3AfterCurring(x:Int)(y:Int) = x*y println(multiple3AfterCurring(4)(5)) //必须传递两个参数,否则编译报错 val a = Array("XX","YY") val b = Array("xx","yy") println(a.corresponds(b)(_.equalsIgnoreCase(_))) } }

2、结果

6
12
20
true

隐式转换

当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。

使用方式:

1.将方法或变量标记为implicit
2.将方法的参数列表标记为implicit
3.将类标记为implicit


Scala支持两种形式的隐式转换:

隐式值:用于给方法提供参数
隐式视图:用于类型间转换或使针对某类型的方法能调用成功

隐式值:

例1:声明person方法。其参数为name,类型String

scala> def person(implicit name : String) = name  //name为隐式参数
person: (implicit name: String)String

直接调用person方法

scala> person
<console>:9: error: could not find implicit value for parameter name: Stringperson

报错!编译器说无法为参数name找到一个隐式值

定义一个隐式值后再调用person方法

scala> implicit val p = "mobin"  //p被称为隐式值
p: String = mobin
scala> person
res1: String = mobin

因为将p变量标记为implicit,所以编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺少参数。
但是如果此时你又在REPL中定义一个隐式变量,再次调用方法时就会报错

scala> implicit val p1 = "mobin1"
p1: String = mobin1
scala> person
<console>:11: error: ambiguous implicit values:
both value p of type => String
and value p1 of type => String
match expected type String  person

匹配失败,所以隐式转换必须满足无歧义规则,在声明隐式参数的类型是最好使用特别的或自定义的数据类型,不要使用Int,String这些常用类型,避免碰巧匹配

隐式类:
在scala2.10后提供了隐式类,可以使用implicit声明类,但是需要注意以下几点:

1.其所带的构造参数有且只能有一个
2.隐式类必须被定义在类,伴生对象和包对象里
3.隐式类不能是case class(case class在定义会自动生成伴生对象与2矛盾)
4.作用域内不能有与之相同名称的标示符

object Stringutils { implicit class StringImprovement(val s : String){ //隐式类 def increment = s.map(x => (x +1).toChar) } } object Main extends App{ import com.mobin.scala.implicitPackage.Stringutils._ println("mobin".increment) }

编译器在mobin对象调用increment时发现对象上并没有increment方法,此时编译器就会在作用域范围内搜索隐式    实体,发现有符合的隐式类可以用来转换成带有increment方法的StringImprovement类,最终调用increment方法。

隐式转换的时机:

1.当方法中的参数的类型与目标类型不一致时
2.当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换


隐式解析机制

即编译器是如何查找到缺失信息的,解析具有以下两种规则:
1.首先会在当前代码作用域下查找隐式实体(隐式方法 隐式类 隐式对象)
2.如果第一条规则查找隐式实体失败,会继续在隐式参数的类型的作用域里查找
类型的作用域是指与该类型相关联的全部伴生模块,一个隐式实体的类型T它的查找范围如下:
(1)如果T被定义为T with A with B with C,那么A,B,C都是T的部分,在T的隐式解析过程中,它们的伴生对象都会被搜索
(2)如果T是参数化类型,那么类型参数和与类型参数相关联的部分都算作T的部分,比如List[String]的隐式搜索会搜索List的
伴生对象和String的伴生对象
(3) 如果T是一个单例类型p.T,即T是属于某个p对象内,那么这个p对象也会被搜索
(4) 如果T是个类型注入S#T,那么S和T都会被搜索

隐式转换的前提:

1.不存在二义性
2.隐式操作不能嵌套使用(如 convert1(covert2(x)))+y
3.代码能够在不使用隐式转换的前提下能编译通过,就不会进行隐式黑铁

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala高阶函数 的相关文章

  • 如何以最佳方式传递元组参数?

    如何以最佳方式传递元组参数 Example def foo Int Int def bar a Int b Int 现在我想传递的输出foo to bar 这可以通过以下方式实现 val fooResult foo bar fooResul
  • 以编程方式启动 Scala REPL?

    我想从命令行启动 Scala Swing 应用程序 然后在应用程序启动后 放入 Scala REPL 中以用作控制界面 理想情况下 我还想预先绑定一些变量名称 更好的是使用 REPL 的 Java2D 终端模拟器 但我找不到任何合适的东西
  • 在 Akka/Scala 中使用带有 future 的 mapTo

    我最近开始使用 Akka Scala 编码 遇到了以下问题 通过范围内的隐式转换 例如 implicit def convertTypeAtoTypeX a TypeA TypeX TypeX just some kinda convers
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • 模拟 BlazeClientBuilder[IO] 以返回模拟客户端[IO]

    我正在使用BlazeClientBuilder IO resource方法得到Client IO 现在 我想模拟客户端进行单元测试 但不知道该怎么做 有没有一个好的方法来嘲笑这个 我会怎么做 class ExternalCall val r
  • 可选择将项目添加到 Scala 映射

    我正在寻找这个问题的惯用解决方案 我正在构建一个valScala 不可变 Map 并希望有选择地添加一项或多项 val aMap Map key1 gt value1 key2 gt value2 if condition key3 gt
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • andThen 类型不匹配的 Scala 链接函数

    我有一堆函数可以清理文本并将它们分成单词 最小的例子 val txt Mary had a little nlamb val stopwords Seq a def clean text String String text replace
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • Akka-Streams 收集数据(Source -> Flow -> Flow (collect) -> Sink)

    我对 Scala 和 Akka 完全陌生 我有一个简单的 RunnableFlow Source gt Flow do some transformation gt Sink runForeach 现在我想要这样的东西 Source gt
  • scala 提供类似 C++ 模板的东西吗?

    我来自 C 并试图了解 scala 的类型系统 考虑以下 C 模板类 template
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • 如何通过 javascript 和 ajax 调用 Scala 中的方法?

    我不知道我的标题是否有点误导 但这是我真正需要帮助的 我正在获取这个网址 get fb login fbEmail function data console log data 这是我的路线 GET fb login email prese
  • 获取SettingKey[T]的值

    我正在开发一个用于文档生成的插件 我想将所有生成的文件输出到我选择的目录中 该目录可以是SBT的子目录target目录 如下 val newTargetDirectory SettingKey File document target di
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 如何使用scala获取elasticsearch中_delete_by_query api的状态

    我正在 scala 中向 elasticsearch 发送 HTTP post Http s http elkIp 5051 indexName delete by query postData s query terms zip id k
  • 使用 Shapeless 记录组合任意数量的状态更改函数

    我正在尝试移植combineReducers从 Redux 到 Scala 这个想法是每个函数控制它的一小部分状态并且combineReducers创建一个控制整个状态的函数 我无法找出应该像这样工作的函数所需的签名 sealed trai
  • Scala 和 Python 的通行证

    我想知道 是否有相当于 python 的 pass 表达式 这个想法是编写没有实现的方法签名 并编译它们只是为了对某些库原型的这些签名进行类型检查 我能够使用以下方法模拟这种行为 def pass A A throw new Excepti
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag

随机推荐

  • easyexcel poi 指定行指定列设置样式

    easyexcel poi 指定行指定列设置样式 1 给指定行指定列设置字体及居中 2 给指定行指定列设置边框 1 给指定行指定列设置字体及居中 给指定行指定列设置字体及居中 param workbook param rowIndex 第几
  • 【小沐学CAD】虚拟仿真开发工具:GL Studio

    文章目录 1 简介 2 软件功能 3 应用行业 3 1 航空 3 2 汽车 3 3 防御 3 4 工业 3 5 电力与能源 3 6 医疗 3 7 空间 3 8 科技 结语 1 简介 https disti com gl studio htt
  • 数据结构之算法复杂度篇

    要努力 但是不要急 繁花锦簇 硕果累累都需要过程 目录 前言 1 什么是数据结构 2 什么是算法 3 算法的复杂度 1 概念 2 时间复杂度 3 空间复杂度 4 常见的复杂度对比 4 复杂度的oj练习 5 总结 前言 在程序段运行的时候 我
  • 将h5封装为微信小程序

    1 要求网站域名必须为https 2 登录微信公众号好注册一个小程序账号 3 打开威胁你开发者工具进行创建 4 打开app json文件 pages项只保留 pages index index 这一行 5 打开 pages index in
  • 【千律】C++基础:类定义和类实现的分离

    类定义就是指定义类名 是 h文件 类实现是指对类定义的具体实现 是 cpp文件 下面是Student h中的内容 pragma once include
  • frc机器人比赛主题_参加了十几场机器人竞赛后,我才敢告诉你:怎样做到不“踩坑”?...

    在决定参加比赛之前 先问自己为什么 为什么要先聊这一点 因为这个问题会决定你的很多选择 很多家长会先去看那个 果 比如 比赛获奖有没有用 这个比赛含金量如何 但是这个 因 是每个家长要先问自己的 你是不是认同机器人竞赛是对孩子综合能力的提升
  • 2000端口号的坑

    这两天对接某游戏的充值接口的时候碰到一个恶心的问题 公司机器和服务器请求游戏方2000端口号的时候 死活获取不到返回No Response 但是同一个请求串外网环境都是正常的 经多次和游戏方你来我往之后发现 2000端口默认是sccp协议
  • 2W字长文吐血整理 Docker&云原生

    Docker 和 云原生 一 概念介绍 1 1 Docker Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 然后发布到任何流行的 Linux或Windows操作系统的机器上 也可以实现虚拟
  • React 应用的 Nginx 缓存控制

    典型 React 应用面临的缓存问题 可通过 Nginx 配置进行解决 通用部署 构建应用后 只需使用 Nginx 指向静态文件即可 server listen 80 root PATH TO APP build try files uri
  • 爬虫碎碎念

    20230304 非专业人士 简单记录自己的需求和思考 0 引言 平时看到一些网站的照片什么的 有那种批量下载的需求 当然有些也是视频网站的图片介绍什么的 也即是说 我需要把这些网站的照片批量下载下来 以前的时候 写过简单的爬虫 因为需求比
  • Docker——搭建ELK

    安装Elasticsearch 1 拉取镜像 docker box home box docker pull elasticsearch 7 14 2 2 在宿主机准备配置文件 创建目录 docker box mkdir p server0
  • 资源list:Github上关于大数据的开源项目、论文等合集

    Awesome Big Data A curated list of awesome big data frameworks resources and other awesomeness Inspired byawesome php aw
  • 注释转换(C->C++)

    转换原理图解 基于上图原理 可以写出代码 主函数 define CRT SECURE NO WARNINGS 1 include
  • Jenkins从配置到实战(二) - Jenkins的Master-Slave分布式构建

    前言 Jenkins的Master Slave分布式构建 就是通过将构建过程分配到从属Slave节点上 从而减轻Master节点的压力 而且可以同时构建多个 有点类似负载均衡的概念 简单理解就是 将Jenkins服务器上的构建任务分配到其他
  • 数据采集专家----4通道AD采集子卡推荐

    FMC136是一款4通道250MHz采样率16位AD采集FMC子卡 符合VITA57规范 可以作为一个理想的IO模块耦合至FPGA前端 4通道AD通过高带宽的FMC连接器 HPC 连接至FPGA从而大大降低了系统信号延迟 该板卡支持板上可编
  • Unity_Shader高级篇_16_Unity Shader入门精要_减少计算复杂度

    16 8 减少计算复杂度 16 8 1 Shader的LOD技术 和16 5 2提到的模型的LOD技术类似 Shader的LOD技术可以控制使用的Shader等级 它的原理是 只有Shader的LOD值小于某个设定的值 这个Shader才会
  • vue rsa对密码加密(jsencrypt)

    首先用npm命令下载jsencrypt npm install jsencrypt dep 在vue文件中引入jsencrypt import JSEncrypt from jsencrypt 对password加密 this encryp
  • vcglib 说明(转载)

    先来看看 VCGlib 能做什么 最基本的 它提供 Mesh triangular mesh tetrahedralmesh 三角网格或四面体网格 数据结构的定义 该数据结构支持对 Mesh数据的快速访问 拓扑信息 空间查询等 以及高效执行
  • Linux编译器-gcc 的使用以及 make/Makefile的用法

    文章目录 一 gcc 编译器 1 gcc 命令格式 gcc选项 2 完成过程 2 1预处理 2 2 编译 生成汇编 2 3 汇编 生成机器可识别代码 2 4 链接 生成可执行文件 二 make Makefile 1 简单介绍 2 示例代码
  • Scala高阶函数

    匿名函数 而在大量的spark中大都用的是匿名函数 不为函数命名 然后将其复制个一个变量 如 匿名函数格式 Val 变量名 参数 类型 gt 函数体 高阶函数 函数参数 1 将函数做参数传给另一个函数 如 首先我们定义了一个函数BigDat