1.scala的函数字面量
语法:(参数列表)=>{方法体}
2.函数字面量的简化:
①._(占位符)。当使用占位符替换变量时,需要指明变量的类型。
②.只有一个表达式时,可省略括号。例如:可以把(x:Int)=>{x+1}简写成(x:Int)=>x+1。
3.函数进阶的作用:自己不产生价值,调用其它的函数产生价值。
4.函数字面量的实例如下:
def main(args: Array[String]): Unit = {
//字面量
//教室310+教室309
println("教室310")//字面量
var classRoom="教室310"//字面量
//定义函数的方式1
def sum(x:Int,y:Int) ={
x+y
}
println(sum(100,200))
//定义函数的方式2
var sum1=(x:Int,y:Int) => {x+y}
//简写1,省略{}
var sum2=(x:Int,y:Int) => x+y
//简写2,用_占位符,(Int,Int)=>Int 它表示一种类型,收到两个整型的参数,返回一个整型值
var sum3:(Int,Int) =>Int = _ + _
//调用一个函数
println(sum1(100,200))
}
}
5.scala的函数的闭包
闭包=函数+非局部函数
特点:保持引用
闭包:一个函数连同该函数的非局部变量的一个引用环境。写一个函数,它的返回值是一个函数。
6.闭包的实例如下:
//写一个函数,它的返回值是一个函数
def main(args: Array[String]): Unit = {
var f = (x:Int) => {
var t =(y:Int) => x+y
//t是一个函数
//x就是一个非局部变量
t
//闭包=函数+非局部变量
//特点:保持引用
}
var s =f(100)//s:(y:Int)=>100+y
var res =s(200) //300
var res1=s(300) //300
println(res,res1)
}
//闭包的实例:
def main(args: Array[String]): Unit = {
//奶茶店1
var add = (x:Int,y:Int) => x + y
//咖啡店1
var mul= (x:Int,y:Int) => x * y
//定义一个函数,它的特点是:第一个参数的类型是函数
//美团
var op=(fn:(Int,Int)=>Int,a:Int,b:Int) =>{
fn(a,b)
}
// add(100,200)
println(op(add,100,200))
println(op(mul,100,200))
}
7.scala的函数的柯里化
柯里化:1个小括号包含1个参数。
语法:def 函数名(参数列表1) (参数列表2).....(参数列表n):type={
方法体
}
8.柯里化的注意要点:
①.不能传递部分函数。
②.可以利用隐式参数传递部分值。
③.不能返回新的函数。
9.函数柯里化实例如下:
def main(args: Array[String]): Unit = {
def add(x:Int,y:Int)=x+y
println(add(100,300))
//柯里化的方式,定义一个函数
def add(x:Int)(y:Int)(z:Int)=x+y+z
//调用
// println(add(100)(300)_)
println(add(100)(200)(300))//直接给三个参数
var t=add(100)(300)_//表示一个占位符。先算有两个参数的情况,结果是一个函数
println(t(200))//传入最后一个参数,就能计算结果了
}
10.Scala部分应用函数
①.部分应用函数的定义:如果一个函数包含多个参数,对该函数传递部分参数使得该函数返回一个函数,那么这种函数称为部分应用函数。
②.部分应用函数的语法:
def 函数名 (参数列表X,Y....):type={
f(Y)
}
③.部分应用函数的作用:返回新的函数。
11.部分应用函数的实例如下:
def main(args: Array[String]): Unit = {
def mul(x:Int,y:Int,z:Int):Int ={
println(s"x=$x,y=$y,z=$z")
x*y*z
}
//println(mul(10,2,3))
//f是:部分函数
//_是:部分函数
var f=mul(10,2,_)
println(f(3))
}
}