五:scala函数
1函数创建方式
方式1:方法转换为函数
方式:方法名 _
res6: (Int, Int) => Int = <function2>
<function2>

代表一个函数,并且有两个参数。
(Int, Int)
代表参数列表
Int
代表返回值类型
=>
代表函数
方式2 定义函数:
val h1 = (a:Int,b:Int) => {a * b}

h1:函数名
(a:Int,b:Int):函数的参数类型
{a * b}:函数体
2传值调用&传名调用
函数式编程:方法的参数可以是一个函数
编写代码来说明这个问题
package dawn.day02
/**
* @author Dawn
* 2019年6月11日17:56:52
* @version 1.0
* 传值调用&传名调用 测试
*/
object ZFBToPay {
var money=1000
//每次吃饭花50
def eat()={
money-=50
}
//余额
def balance():Int={
//已调用一次eat方法
eat()
money
}
//传值调用:传递的是函数 call by value
def printMoney1(x:Int):Unit={
for(a <- 1 to 5){
println(s"你的余额现在为:$x")
}
}
//传名调用测试 (实际上传的是一个函数)call by name
//此时余额减了5次 x: => Int 表示的是一个方法的签名 没有参数 返回值是int类型的函数
def printMoney2(x: => Int):Unit={
for(a <- 1 to 5){
println(s"你的余额现在为:$x")
}
}
def main(args: Array[String]): Unit = {
// eat()
// balance()
//传值调用: call by value,这里就相当只调用了一次
// printMoney1(balance())
//传名调用 call by name,函数实参每次在函数体内被用到时都会求值
printMoney2(balance)
}
}
传值调用:
1.先计算balance的值
2.把这个值作为参数传递给printMoney
运行结果:

传名调用:传递的是函数
将balance方法的名称传递到方法内部执行
运行结果:

3 可变参数函数
java中的可变参数:public static void m1(String ...arg){}
scala中的可变参数:def sum(ints:Int*): Int ={}
加了通配符*
代码如下:
package dawn.day02
/**
* @author Dawn
* 2019年6月11日18:22:13
* @version 1.0
* 测试函数的可变参数
*/
object ManyParam {
def sum(moneys:Int*):Int={
var sum=0
for (v <- moneys){
sum+=v
}
sum
}
/*
不仅是可变参
而且参数的类型不一致
Any
*/
def setName(params:Any*):Any={
return params
}
def main(args: Array[String]): Unit = {
println(sum(1,5,6,4))
println(setName("dawn",20,"渴望恋爱"))
}
}
运行结果

4 默认参数值函数
如果传递了参数,则使用传递的值。如果不传递参数,则使用默认

运行结果如下:

5高阶函数
定义:将其他函数作为参数,或者其结果是函数的函数。
示例1:
(*)首先,定义一个最普通的函数

(*)再定义一个高阶函数

(*)分析这个高阶函数调用的过程

示例2:

在这个例子中,首先定义了一个普通的函数mytest,然后定义了一个高阶函数myFunction;myFunction接收三个参数:第一个f是一个函数参数,第二个是x,第三个是y。而f是一个函数参数,本身接收两个Int的参数,返回一个Int的值。
6 部分参数应用函数
如果函数传递所有预期的函数,则表示完全应用它了。
如果只传递几个参数,并不是全部参数,那么将返回部分应用的函数。

运行结果如下:

7 字符串的格式化输出
文字插值器:f/s
就使用上面部分参数应用函数的代码。其中f s都是一样的效果

8 柯理化
柯里化函数(Curried Function)是把具有多个参数的函数转换为一条函数链,每个节点上是单一参数。

一个简单的例子:

总结:函数的通用性降低,但是适用性提高
9偏函数
被包在花括号内没有match的一组case语句的是一个偏函数。 PartialFunction[A,B]
A:参数类型
B:返回类型
常用与模式匹配

运行结果
