黑猴子的家:Scala 作为参数的函数

Scala 混合了面向对象编程和函数式编程的特性,在函数式编程语言中,函数是头等公民,可以向任何其它数据类型一样,被传递和操作,每当你想要给算法传入明细动作时,这个特性就会变得非常有用,在函数式编程语言中,你只需要将明细动作包在函数当中,作为参数传入即可。

在Scala中,函数是头等公民,就和数字一样,可以在变量中存放函数

函数作为一个变量传入到了另一个函数中,就是高阶函数,在spark中应用最多的是函数
如果你用Scala做大型项目的话,可能会创建一些类什么的,但是你用Spark单独做数据分析的话,应用最多的是高阶函数,直接用函数处理起来,会更容易一些

函数在Scala是一个对象,既然是对象,它就有类型,函数的类型是Function类型,含有一共有23个特征 Function0 … Function22,数字代表这个Function能够传递参数的个数

如果你想传递,超过23个的参数,你可以放到一个集合里面,Java里面我们很少考虑一个问题就是,一个.class类它最大会有多大,比如说我写代码,我写了一个TB的代码,在一个
.class里面你说能不能写呢? 它有一个最大的承载量,方法的个数声明,不能超过3千多个,
一个类里面,不能超过3千多个方法的声明,它是有极限的,一个class文件一个TB,虽然理论上是可以实现的,但是物理上实现不了的,没有那么大的存储量来做这件事情,任何事情都是有限制的,所以Function 这里是23个

那么该作为参数的函数的类型是:function1,即:(参数类型) => 返回类型

1、基本案例

def plus(x: Int) = 3 + x
//将定义的函数,传递到map函数里面应用
val result1 = Array(1, 2, 3, 4).map(plus(_))
println(result1.mkString(","))

println("\n作为参数的函数  之改写1")
val array2 = Array(1,2,3,4).map(_+3)
println(array2.mkString(" "))

//把这个函数定义到外面,例如 plus ,通过函数名,直接扔进去,对每个元素,应用于这个函数,这就是高阶函数
//高阶函数一句话总结:一个函数,可以接收函数类型的参数,称为高阶函数
println("\n作为参数的函数  之改写2")
val array3 = Array(1,2,3,4).map((x) => x+3)
val array3 = Array(1,2,3,4).map(x => x+3)
println(array3.mkString(" "))

尖叫提示:带有一个参数的函数的类型是function1,带有两个是function2,以此类推

2、扩展案例

def shopFunc(x: Int, n: String, p: Boolean): String = {
  println(x)
  println(n)
  println(p)
  n
}

def transferFunc(str: String, f: (Int, String, Boolean) => String): Unit = {
    f(78,"heihei",false)
}

println(transferFunc("99",shopFunc))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值