一、Scala中的方法
1、方法:方法是对一段代码的封装或者是对代码的抽取,为了实现某个功能,方法定义完成以后不会自动执行,需要手动进行调用。
2、Java中定义方法:
public\protected\private\default\friendly returnType methodName(argType arguments....){ 方法体 }
3、Scala中定义方法:
scala中定义方法的关键字是:def;
scala中方法类型是后置定语;
def methodName(arg:Type......): ={ }
备注:scala中方法的返回值可以加也可以不加,如果不加返回值类型系统会自适配
例:定义求和的方法
1 def main(args: Array[String]): Unit = { 2 val re=sum(100,80) 3 println("计算总和是:"+re) 4 } 5 def sum(num1:Int,num2:Int):Double={ 6 val res=num1+num2 7 return res 8 }
4、Scala中方法定义的时候如果方法名后面没有添加小括号,在调用的时候不能添加小括号,如果方法名称有小括号,那么在调用的时候可以添加小括号,也可以不添加小括号
例:
1 def main(args: Array[String]): Unit = { 2 printInfo //调用不能添加() 3 } 4 def printInfo:Unit={ //方法中没有() 5 println("hello world") 6 }
5、如果方法中的参数是多个并且数据类型一样,可以使用*代替。可变参数。
1 def main(args: Array[String]): Unit = { 2 val result = sum(11,22,33,44,55) 3 println("累加和是:"+result) 4 } 5 //定义参数个数不确定的求和方法 6 def sum(number:Int*):Int= { 7 var res = 0 8 for(n<-number){ 9 res+=n 10 } 11 return res 12 }
1 def main(args: Array[String]): Unit = { 2 val result = sum(11,22,33,44,55) 3 println("累加和是:"+result) 4 } 5 //定义参数个数不确定的求和方法 6 def sum(number:Int*):Int= { 7 number.sum 8 }
6、方法中的返回值
(1)返回值关键字是return
(2) 方法中如果最后没有返回值类型不能使用return关键字
(3)方法中没有返回值不能使用return关键字
(4)方法中不添加return关键字,返回值类型会自己适配。
(5)方法中如果使用return关键字,方法中必须添加返回值类型
例:阶乘练习
1 def main(args: Array[String]): Unit = { 2 val result = jiecheng(5) 3 println("5!="+result) 4 } 5 def jiecheng(number:Int):Int={ 6 if(number==1) { 7 return number 8 }else{ 9 return number*jiecheng(number-1) 10 } 11 }
二、Scala中的函数
1、函数是方法的另一种体现形式,也是一段代码的综合体,函数约等于方法
2、Scala中的函数定义
关键字:val
[scala中函数是可以被传递的,那么可以把函数理解为一个值,既然是值那么定义的时候使用val关键字]
语法:
val functionName=(参数:参数类型.....)=>逻辑
val functionName=(number:Int,number1:Int)=>number1+number
3、函数名称后面不能添加小括号,方法名称后如果没有参数可以不加( ),有参数必须添加()
1 def main(args: Array[String]): Unit = { 2 val sum=(a:Int,b:Int)=>(a+b) 3 val res=sum(100,200) 4 println("计算总和是:"+res) 5 }
4、函数签名信息
(1)函数的签名信息: 函数名称:{参数类型,参数类型}=>返回值类型=<实现的接口名称>
(2)function2:参数有N个,定义出来的函数签名信息functionN,但是最多不能超过0-22个。 【 函数参数个数: 最少0个,最多22个 】
(3)FunctionN是一个trait特质【接口】,接口中都会有一个构造器apply(N参数)
我们声明的函数,其实是在实现特质,所参数只能放置22个。【其实定义好的函数不是自己定义的,而是在实现定义好的接口】
5、匿名函数
即没有名称的函数
例:将数组中的每个元素*10
1 def main(args: Array[String]): Unit = { 2 val arr=Array(11,22,33,44,55) 3 val ints:Array[Int]=arr.map((a:Int)=>a*10) 4 for(arr1<-ints){ 5 print(arr1+" ") 6 } 7 }
6、Scala中的高阶函数
(1)函数作为返回值
(2)函数作为方法的参数进行传递
1 //定义方法,参数是一个匿名函数 2 def sum(function:(Int,Int)=>Int):Int={ 3 return function(11,22) 4 } 5 //定义函数让方法进行调用 6 val f=(a:Int,b:Int)=>(a+b) 7 def main(args: Array[String]): Unit = { 8 //调用方法,方法的参数是一个函数 9 val i=sum(f) 10 println(i) 11 }
注意:
-
方法中是形参不能直接定义具体的函数,应该定义一个规范。
-
函数其实是定义了一种规范,然后将规范进行传递,具体怎么实现,在调用的时候再做具体的实现
三、方法和函数区别
1、函数是方法的另一种体现形式,但是方法就是方法,只能被调用。
2、函数可以作为一个值【值是有签名信息的】在方法中作为参数进行传递,还能当成返回值使用。
3、Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
4、Scala 中的方法跟 Java 的类似,方法是组成类的一部分。Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。
5、Scala 中使用 val 语句可以定义函数,def 语句定义方法。
6、Scala中可以将方法转换成函数,使用 _
1 def main(args: Array[String]): Unit = { 2 val add=(a:Int,b:Int)=>(a+b) 3 //正常调用方法 4 var res1=sum(100,200,add) 5 println(res1) 6 7 //将方法转换成函数调用 8 val res2=(sum _)(59,22,add) 9 println(res2) 10 } 11 def sum(a:Int,b:Int,f:(Int,Int)=>Int):Int={ 12 return f(a,b) 13 }
方法的自动转换:
1 def main(args: Array[String]): Unit = { 2 val list=List(12,55,36) 3 //将println方法放到foreach中作为参数,会自动转换为函数 4 list.foreach(println) 5 println("-----------") 6 //将println方法放到foreach中作为参数,手动转换为函数 7 list.foreach(println _) 8 }
四、方法和函数总结
1、函数val => 方法def ={}
2、函数可以作为表达式单独存在,比如单独放置函数,会出现签名信息,方法不能单独出现,只能被调用。
3、函数是头等公民,函数式编程(方法不能定义规范,一旦被调用就得去实现,函数可以定义规范而不去实现)。
4、方法和函数在本质上几乎一样,方法就是函数的另一种体现形式。
5、函数和和方法进行转换 :空格+下划线,也可以自动转换。
6、在方法中传递的都是函数【自动转换】。
7、在scala编程的时候优先使用函数,但是方法用的比较多。