方法
1,定义方法的关键字,def
格式: def 方法的名称(参数列表):返回值类型 = {方法体内容}
2,方法的返回值,最后一行的内容,如果是循环,那么返回值是 Unit
3,如果空参方法,定义的时候有(),调用的时候可以省略(),如果定义的时候没有(),调用方法的时候,不能加()
4,方法的返回值类型,可以省略,但是特殊情况下,必须加上:
4.1,方法有 return 关键字
4.2,递归调用的方法。
5,方法不能最为最终的表达式存在,(空参的方法调用除外)
object ScalaMethod extends App {
def sum(a:Int,b:Int): Int ={
return a + b
}
val i: Int = sum(2,7)
println(i)
}
如果有return关键字,必须要有返回值类型,否则报错
函数
、
和方法类似,基本能实现相同的功能
val| var 函数名称=(函数的参数列表) => 函数体
函数可以作为最终的表达式存在,返回的内容就是函数的签名
签名(函数的名称,函数的参数,函数的返回值类型)
这种定义方式不需要指定返回值类型,编译器会自动推断
方法和函数的区别
方法本质上,就是一种特殊的函数。
在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作
函数可以当成值来进行传递,方法的参数和返回值都可以是函数。
函数和变量,类,对象, 是一个级别的。
区别和联系:
1,方法用 def 关键字定义,函数的标识 =>
2,方法不能作为最终的表达式存在,但是函数可以,返回函数的签名信息
3,方法和函数调用的时候都需要显示的传入参数
4,函数可以作为方法的参数,和返回值类型。
总结
1,方法的定义 使用 def 关键字 函数的定义 使用 =>
函数有两种定义方式
val f = (x:Int,y:Int) => x + y
val f:(Int,Int) => Int = (x,y) => if(x>y) x else y
2,方法不能作为最终的表达式存在,但是函数可以作为最终的表达式存在,返回函数签名
函数签名:函数的名称,参数类型,返回值类型 函数的别名(函数参数个数)
3,方法和函数的调用,方法和函数可以相互调用。
方法名称(参数列表) 函数名称(参数列表)
无参的方法可以省略(),无参的函数不能省略括号
4,函数是一等公民,可以作为方法的参数和返回值类型。
函数作为方法的参数: 定义方法的时候,函数参数规范(函数的名称,参数类型,返回值类型),然后在调用方法的时候,传递的是一个已存在的函数,或者是一个匿名函数。
都要求传入的函数,必须满足定义的规范,使用匿名函数的时候,可以省略参数类型((x,y)=>x*y)
函数最为方法的返回值类型,当调用方法的时候,返回函数,传入参数进行函数的调用。
5,方法可以转化为函数,通过在方法名称 _ ,另外当方法的参数是一个函数的时候,满足条件的方法会被自动转换为函数,进行传递
方法中调用函数
package com.weiyi.scala
object MethodAndFunctionTest {
//定义一个方法
//方法 m2 参数要求是一个函数,函数的参数必须是两个 Int 类型
//返回值类型也是 Int 类型
def m1(f: (Int, Int) => Int) : Int = {
f(2, 6)
}
//定义一个函数 f1,参数是两个 Int 类型,返回值是一个 Int 类型
val f1 = (x: Int, y: Int) => x + y
//再定义一个函数 f2
val f2 = (m: Int, n: Int) => m * n
//main 方法
def main(args: Array[String]) {
//调用 m1 方法,并传入 f1 函数
val r1 = m1(f1)
println(r1)
//调用 m1 方法,并传入 f2 函数
val r2 = m1(f2)
println(r2)
}
}