五: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:返回类型
常用与模式匹配
运行结果