1参数(类型)推断推断,如list=(1,2,3)list.map()map中的函数参数类型可以推断),也可以做相应的缩写。参数类型推断书写说明1)当可以推断出参数类型时,参数类型可以省略2)当传入的函数只有一个参数时,括号可以省略3)如果变量只在右边出现一次=>的一边,可以用_代替应用案例;"复制代码")//分别解释vallist=List(1,2,3,4)println(list.map((x:Int)=>x+1))//(2,3,4,5)println(list.map((x)=>x+1))println(list.map(x=>x+1))println(list.map(_+1))valres=list.reduce(_+_);《复制代码》)应用案例总结1)map是高阶函数,所以也可以直接传入匿名函数完成map2)遍历列表时,参数类型可以Inferred,数据类型可以省略Intprintln(list.map((x)=>x+1))3)当传入函数只有一个参数时,括号可以省略println(list.map(x=>x+1))4)如果变量只在=>右边出现一次,可以用_代替println(list.map(_+1))2闭包(closure)基本介绍:闭包是一个函数及其一个整体(实体)由相关的参考环境组成。//1。等价理解重写2.对象属性理解defminusxy(x:Int)=(y:Int)=>x-y//f函数是一个闭包。valf=minusxy(20)println("f(1)="+f(1))//19println("f(2)="+f(2))//181)点1(y:Int)=>x–yreturns一个匿名函数,因为函数在函数外引用了x,那么函数和x作为一个整体形成了一个闭包。比如:这里valf=minusxy(20)的f函数就是闭包2)你可以这样理解,return函数是一个对象,x是对象的一个??域,它们一起组成一个闭包3)多次调用f时(多次调用闭包可以理解),发现使用的是同一个x,所以x不变。4)使用闭包时,一定要搞清楚函数外的哪些变量被返回函数引用了,因为它们会组合成一个整体(实体),形成闭包闭包的好处1)返回的匿名函数而makeSuffix(suffixstring)的后缀变量组合成一个闭包,因为返回的函数引用了后缀变量2)让我们体验一下闭包的好处。如果使用传统的方式,也可以轻松实现这个功能,但是传统的方式需要每次都传入一个后缀,比如.jpg,闭包可以保留上次引用的一个值,所以我们一次通过后可以重复使用。大家可以仔细体会!3函数柯里化(curry)1)在函数式编程中,可以将接受多个参数的函数转化为接受单个参数的函数。这个转换过程称为柯里化。2)柯里化证明函数只需要一个参数。其实柯里化操作在刚才我们的学习过程中就已经涉及到了。3)无需设置柯里化存在的意义等命题。柯里化是以函数为主体的思想发展的必然结果。(即:柯里化是面向函数思维的必然结果)FunctionCurryingQuickStart编写一个函数,它接收两个整数并能返回这两个数的乘积。要求:使用常规方式完成,使用闭包的方式完成,使用函数Curry;"复制代码")//说明defmul(x:Int,y:Int)=x*yprintln(mul(10,10))defmulCurry(x:Int)=(y:Int)=>x*yprintln(mulCurry(10)(9))defmulCurry2(x:Int)(y:Int)=x*yprintln(mulCurry2(10)(8));《复制代码》)4控制抽象如何将一段代码(形式上)作为参数传递给高阶函数,并在高阶函数内部执行这段代码。使用的形式是易碎的{}。;“复制代码”)varn=10breakable{while(n<=20){n+=1if(n==18){break()}}};《复制代码》)控件抽象基本介绍控件抽象是这样一个函数满足以下条件1)参数是一个函数2)函数参数没有输入值,也没有返回值;"复制代码")defmyRunInThread(f1:()=>Unit)={newThread{overridedefrun():Unit\={f1()}}.start()}myRunInThread{()\=>println("工作!5秒内完成...")Thread.sleep(5000)println("完成!")};"复制代码")简化处理,省略(),高级用法如下形式:实现一个类似于while的until函数
