网络公司做机场网站,如何安装网站模板,企业vi设计公司定制,湖州注册公司文章目录 1. 函数 vs 方法1.1 方法(1) 定义方法(2) 运算符即方法 1.2 函数(1) 定义函数(2) 匿名函数 1.3 方法转为函数1.4 可变参数默认参数 2. 函数至简原则3. 函数式编程3.1 函数式编程思想3.3 函数柯里化闭包3.5 递归 尾递归 4. 补充4.1 访问元祖元素4.2 默认参数 2. 函数至简原则3. 函数式编程3.1 函数式编程思想3.3 函数柯里化闭包3.5 递归 尾递归 4. 补充4.1 访问元祖元素4.2 的含义4.3 下划线的使用总结 1. 函数 vs 方法
在Java中方法与函数没区别但是在Scala中方法和函数是不一样的。Java是面向对象的Scala是面向函数式编程的主要体现在如下4点
Java对象可以作为一个值传递对象可以作为参数传递对象可以作为返回值传递可以调用对象Scala函数可以作为一个值传递函数可以作为参数传递函数可以作为返回值传递可以调用函数Scala方法不可以作为一个值传递方法不可以作为参数传递方法不可以作为返回值传递可以调用函数
可以看出Scala中函数比方法更加强大而函数相比于方法最重要的功能就是函数能作为参数传递也就是说a和b进行的操作不是写死的而是可变的。
从位置上理解方法 只能在类中定义做为类的属性函数 可以在任何地方定义。从是否可以重载的角度方法定义在类中可以实现重载函数不可以重载。从运行位置角度方法是保存在方法区函数是保存在堆中。
1.1 方法
(1) 定义方法
定义方法语法如下
object 类名 {def 方法名([变量变量类型变量变量类型]):返回值类型 {方法体}
}比如 方法不能作为值传递 object Main {def main(args: Array[String]): Unit {def add(x:Int, y:Int):Int {x y}val result add // 会报错println(result)}
}方法不能作为参数传递 object Main {def main(args: Array[String]): Unit {// 1. 定义calculate方法def calculate(x: Int, y: Int, func: (Int, Int) Int): Int { // x与y进行func操作这个func函数需要指名 形参类型和返回值func(x, y)}// 2. 定义add方法def add(x:Int, y:Int):Int {x y}// 3. 函数作为参数传递val result calculate(2, 3, add) // 不会报错自动转为函数传递println(result)}
}方法不能作为返回值传递 object Main {def main(args: Array[String]): Unit {// 1. 定义getFunc方法def getFunc() { // x与y进行func操作这个func函数需要指名 形参类型和返回值def func(x: Int, y: Int) {x y} func // 会报错}// 2. 得到函数println(getFunc())}
}方法可以直接调用 object Main {def main(args: Array[String]): Unit {def add(x: Int, y: Int) x yprintln(add(2, 3)) // 输出5}
}
(2) 运算符即方法
所有的运算符本质上是方法。比如查看Int类 可以看到类中定义了很多以运算符命名的方法 因此以下两种方法是等价的 val a 1 2val a 1.(2)反过来可以定义这样的方法并调用 例子1 object Cal {def say(x:Int):Int x
}object Main {def main(args: Array[String]): Unit {// 1. 用 类.方法名(参数列表) 形式调用方法var result1 Cal.say(3)// 2. 用 类 方法 参数列表 形式调用方法var result2 Cal say (3) var result3 Cal say 3 // 如果参数列表只有一个值括号是可以省略的}
}例子2 object Main {def say(x:Int):Int xdef main(args: Array[String]): Unit {// 1. 用 类.方法名(参数列表) 形式调用方法var result1 this.say(3)// 2. 用 类 方法 参数列表 形式调用方法var result2 this say (3) // 如果参数列表只有一个值括号是可以省略的var result3 this say 3}
}1.2 函数
(1) 定义函数
Scala中有23个函数接口类函数的本质就是实现这些接口类来实现强大的功能
Function0无参数无返回值Function1…
定义函数语法如下
object 类名 {def 函数名:([变量类型变量类型])返回值类型 ([变量变量类型变量变量类型]) {方法体}
}比如 函数可以作为一个值传递 object Main {def main(args: Array[String]): Unit {val add (x:Int, y:Int) x yval result add // 不会报错println(result) }
}函数可以作为参数传递此时需要指名函数的类型。格式为(参数类型)返回值类型 object Main {def main(args: Array[String]): Unit {// 1. 定义calculate方法def calculate(x:Int, y:Int, func:(Int, Int)Int): Int { // x与y进行func操作这个func函数需要指名 形参类型和返回值func(x, y)}// 2. 定义add函数def add (x:Int, y:Int) x y// 3. 函数作为参数传递val result calculate(2, 3, add)// 4. 输出println(result) // 输出5}
}函数可以作为返回值传递 object Main {def main(args: Array[String]): Unit {// 1. 定义getFunc方法def getFunc() { // x与y进行func操作这个func函数需要指名 形参类型和返回值val func (x:Int, y:Int) x yfunc}// 2. 得到函数println(getFunc())// 3. 得到函数并执行函数println(getFunc()(2, 3)) // 输出5}
}函数可以执行 object Main {def main(args: Array[String]): Unit {val add (x:Int, y:Int) x yprintln(add(2, 3))}
}(2) 匿名函数
匿名函数与函数的语法区别就在于前者是val关键字后者是def关键字。比如 匿名函数简化了函数值传递 注意这只会定义一个函数也不会执行函数。这点和Java不一样java的lambda表达式是会创建对象并执行构造方法。 1.3 方法转为函数 通用转换方式在方法名后面 空格 _ 即可语法为方法名 _ object Main {def main(args: Array[String]): Unit {def add(x:Int, y:Int):Int {x y}val result add _ // 将方法转为函数println(result(2, 3)) // 输出5}
}在参数处将方法转为函数时可以简化去掉 _直接方法名 object Main {def main(args: Array[String]): Unit {// 1. 定义calculate方法def calculate(x: Int, y: Int, func: (Int, Int) Int): Int { // x与y进行func操作这个func函数需要指名 形参类型和返回值func(x, y)}// 2. 定义add函数def add(x:Int, y:Int):Int {x y}// 3. 函数作为参数传递val result1 calculate(2, 3, add _) // 此时可优化去掉 空格_val result2 calculate(2, 3, add) // 优化后的代码}
}1.4 可变参数默认参数
object Test03_FunArgs {def main(args: Array[String]): Unit {// (1)可变参数在类型后面加*号def sayHi(names:String*):Unit {println(shi $names)}sayHi()sayHi(linhai)sayHi(linhai,jinlian)// (2)可变参数必须在参数列表的最后def sayHi1(sex: String,names:String*):Unit {println(shi $names)}// (3)参数默认值def sayHi2(name:String linhai):Unit {println(shi ${name})}sayHi2(linhai)sayHi2()// (4)默认值参数在使用的时候 可以不在最后def sayHi3( name:String linhai , age:Int):Unit {println(shi ${name})}// (5)带名参数指调用方法时指定传参顺序sayHi3(age 10, name niu)}
}2. 函数至简原则 注意方法最后一行的return可以省略但是除此之外都不能省略。比如 object Test04_FuncSimply {def main(args: Array[String]): Unit {//1return可以省略Scala会使用方法体的最后一行代码作为返回值def func1(x: Int, y: Int): Int {x y}// 2如果方法体只有一行代码可以省略花括号def func2(x: Int, y: Int): Int x y//3返回值类型如果能够推断出来那么可以省略:和返回值类型一起省略// 此时函数就变为了数学表达式的形式f(x, y) x ydef func3(x: Int, y: Int) x y//4如果有return则不能省略返回值类型必须指定def func4(x: Int, y: Int): Int {if (x 20) {return x y}2 * x 3 * y}//5如果方法明确声明unit那么即使函数体中使用return关键字也不起作用def func5(x: Int, y: Int): Unit return x y//6Scala如果期望是无返回值类型可以省略等号def func6(x: Int, y: Int) {println(x y)}// 7如果方法无参但是声明了参数列表那么调用时小括号可加可不加def func7(): Unit {println(hello)}// 8如果方法没有参数列表那么小括号可以省略调用时小括号必须省略def func8 {println(hello)}// 9如果不关心函数名只关心映射逻辑就会变为lambda表达式(x:Int, y:Int) {println(x y)}val func (x:Int, y:Int) {println(x y)} // 如果要设置函数名可以这样。此时func就是函数名}
}3. 函数式编程
3.1 函数式编程思想
函数式编程思想① 当做数学题y f(x)重要的是映射关系。② 使用val在分布式上计算后不会产生歧义通过前面可以知道定义函数有3种形式 方法转函数。先定义方法再方法名 直接定义函数def匿名函数 一看到 或 一看到 _就要想到这是表示函数。 3.3 函数柯里化闭包 闭包内层函数用到了外层函数变量如果直接调用内层函数会取不到外层函数的这个变量值。此时内层函数(万物皆对象函数也是对象)的堆中的对象会保留一份引用到外层函数的值。 闭包参考链接 函数柯里化将一个接收多个参数的函数转化成一个一个接受参数的函数过程可以简单的理解为一种特殊的参数列表声明方式。函数柯里化 object TestFunction {val sum (x: Int, y: Int, z: Int) x y z// 函数柯里化的底层逻辑本质是将函数作为返回值val sum1 (x: Int) {y: Int { // 匿名函数z: Int { // 匿名函数x y z}}}// 函数柯里化的另一种简单表达val sum2 (x: Int) (y: Int) (z: Int) x y z// 方法也有函数柯里化def sum3(x: Int)(y: Int)(z: Int) x y zdef main(args: Array[String]): Unit {sum(1, 2, 3)sum1(1)(2)(3) // sum1(1)调用完后返回一个函数; sum1(1)(2)是调用返回的函数; .......sum2(1)(2)(3)sum3(1)(2)(3)}
}3.5 递归 尾递归 递归与Java中的递归一样前面知道scala的方法返回值是可以省略的默认分配返回值类型但是 如果方法是递归方法则必须指定方法的返回值类型否则会报错。 object Test{def main(args: Array[String]): Unit {// 实现阶乘def fact(n : Int) : Int { // 必须指名方法的返回值类型// 跳出递归if(n 1) return 1// 递归逻辑n * fact(n - 1)}// 调用阶乘方法println(fact(5))}
}尾递归递归是将每次调用函数/方法会压入到栈中是累计使用资源容易造成栈溢出而尾递归是覆盖使用资源不会造成栈溢出。所以尾递归资源利用率更加高。尾递归参考链接 一般支持函数式编程语言都支持尾递归但是Java不支持尾递归。
4. 补充
4.1 访问元祖元素
变量名._数字
比如x._1 表示访问x的第一个元素4.2 的含义
https://blog.csdn.net/qq_43546676/article/details/130992479
4.3 下划线的使用总结
https://blog.csdn.net/qq_43546676/article/details/130874779 文章转载自: http://www.morning.hbkkc.cn.gov.cn.hbkkc.cn http://www.morning.ytnn.cn.gov.cn.ytnn.cn http://www.morning.rmxk.cn.gov.cn.rmxk.cn http://www.morning.blbys.cn.gov.cn.blbys.cn http://www.morning.tlbhq.cn.gov.cn.tlbhq.cn http://www.morning.yrdkl.cn.gov.cn.yrdkl.cn http://www.morning.fksyq.cn.gov.cn.fksyq.cn http://www.morning.lrybz.cn.gov.cn.lrybz.cn http://www.morning.drswd.cn.gov.cn.drswd.cn http://www.morning.qtbnm.cn.gov.cn.qtbnm.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.ybhrb.cn.gov.cn.ybhrb.cn http://www.morning.drqrl.cn.gov.cn.drqrl.cn http://www.morning.lbssg.cn.gov.cn.lbssg.cn http://www.morning.yaqi6.com.gov.cn.yaqi6.com http://www.morning.bwhcl.cn.gov.cn.bwhcl.cn http://www.morning.dxqfh.cn.gov.cn.dxqfh.cn http://www.morning.cknrs.cn.gov.cn.cknrs.cn http://www.morning.jhyfb.cn.gov.cn.jhyfb.cn http://www.morning.ggnrt.cn.gov.cn.ggnrt.cn http://www.morning.rlwgn.cn.gov.cn.rlwgn.cn http://www.morning.mqfkd.cn.gov.cn.mqfkd.cn http://www.morning.kaweilu.com.gov.cn.kaweilu.com http://www.morning.jsphr.cn.gov.cn.jsphr.cn http://www.morning.elsemon.com.gov.cn.elsemon.com http://www.morning.ssglh.cn.gov.cn.ssglh.cn http://www.morning.mcjp.cn.gov.cn.mcjp.cn http://www.morning.khxwp.cn.gov.cn.khxwp.cn http://www.morning.wjlkz.cn.gov.cn.wjlkz.cn http://www.morning.dhqzc.cn.gov.cn.dhqzc.cn http://www.morning.lbrwm.cn.gov.cn.lbrwm.cn http://www.morning.nmrtb.cn.gov.cn.nmrtb.cn http://www.morning.xhklb.cn.gov.cn.xhklb.cn http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.jrlxz.cn.gov.cn.jrlxz.cn http://www.morning.wckrl.cn.gov.cn.wckrl.cn http://www.morning.mprtj.cn.gov.cn.mprtj.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn http://www.morning.zhishizf.cn.gov.cn.zhishizf.cn http://www.morning.ynrzf.cn.gov.cn.ynrzf.cn http://www.morning.qbwmz.cn.gov.cn.qbwmz.cn http://www.morning.mhbcy.cn.gov.cn.mhbcy.cn http://www.morning.mdpcz.cn.gov.cn.mdpcz.cn http://www.morning.qlbmc.cn.gov.cn.qlbmc.cn http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn http://www.morning.fhrgk.cn.gov.cn.fhrgk.cn http://www.morning.kqrql.cn.gov.cn.kqrql.cn http://www.morning.zphlb.cn.gov.cn.zphlb.cn http://www.morning.rftk.cn.gov.cn.rftk.cn http://www.morning.znqxt.cn.gov.cn.znqxt.cn http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn http://www.morning.lwdzt.cn.gov.cn.lwdzt.cn http://www.morning.smggx.cn.gov.cn.smggx.cn http://www.morning.wqjpl.cn.gov.cn.wqjpl.cn http://www.morning.wxccm.cn.gov.cn.wxccm.cn http://www.morning.gmmxh.cn.gov.cn.gmmxh.cn http://www.morning.jtfsd.cn.gov.cn.jtfsd.cn http://www.morning.lkbkd.cn.gov.cn.lkbkd.cn http://www.morning.xplng.cn.gov.cn.xplng.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.bbjw.cn.gov.cn.bbjw.cn http://www.morning.wmgjq.cn.gov.cn.wmgjq.cn http://www.morning.lmyq.cn.gov.cn.lmyq.cn http://www.morning.nkpls.cn.gov.cn.nkpls.cn http://www.morning.jjwt.cn.gov.cn.jjwt.cn http://www.morning.nbfkk.cn.gov.cn.nbfkk.cn http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn http://www.morning.snbrs.cn.gov.cn.snbrs.cn http://www.morning.nbrkt.cn.gov.cn.nbrkt.cn http://www.morning.qtrlh.cn.gov.cn.qtrlh.cn http://www.morning.fhqsm.cn.gov.cn.fhqsm.cn http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn http://www.morning.ngkgy.cn.gov.cn.ngkgy.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.pxsn.cn.gov.cn.pxsn.cn http://www.morning.khpgd.cn.gov.cn.khpgd.cn