Scala系列(3)- 方法、函数

467 阅读3分钟

1. 方法

1.1 定义方法

语法

[TIP]
1、参数类型不可以省略
2、返回值类型可以省略,scala会自动推断
3、返回值可以不写return,默认就是{}块表达式的值
def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
    // 方法体:一系列的代码
}

示例

  1. 实现一个加法运算

参考代码

// 不写参数类型,会报错
scala> def add(x,y) = {x + y}
<console>:1: error: ':' expected but ',' found.
def add(x,y) = {x + y}
         ^

scala> def add(x:Int,y:Int) = {x + y}
add: (x: Int, y: Int)Int

scala> add(3,4)
res1: Int = 7

1.2 返回值类型推断

在定义方法的时候,一般都可以省略返回值类型,但是递归不省略返回值类型

参考代码

scala> def m2(x:Int) = {
     | if(x<=1) 1
     | else m2(x-1) * x
     | }
<console>:13: error: recursive method m2 needs result type
       else m2(x-1) * x

// 加上返回值类型
scala> def m2(x:Int):Int={ if(x<=1) 1 else x * m2(x-1)}
m2: (x: Int)Int

1.3 方法参数

scala中的方法参数,使用比较灵活。它支持以下几种类型的参数:

  • 默认参数
  • 带名参数
  • 变长参数

1.3.1 默认参数

在定义方法时可以给参数定义一个默认值。

// x,y带有默认值
scala> def add(x:Int=1,y:Int=3)= x+y
add: (x: Int, y: Int)Int

scala> add()
res4: Int = 4

1.3.2 带名参数

在调用方法时,可以指定参数的名称来进行调用。

参考代码

scala> def add(x:Int=1,y:Int=3)= x+y
add: (x: Int, y: Int)Int
// 只指定x的值。y的值采用默认的
scala> add(x=2)
res5: Int = 5

1.3.3 变长参数

如果方法的参数是不固定的,可以定义一个方法的参数是变长参数。

语法格式:

// 在参数类型后面加一个`*`号,表示参数可以是0个或者多个
def 方法名(参数名:参数类型*):返回值类型 = {
    方法体
}

参考代码

scala> def add(num:Int*) = num.sum
add: (num: Int*)Int

scala> add(1,2,3,4,5)
res1: Int = 15

1.4 方法调用方式

1.4.1 后缀调用法

语法

对象名.方法名(参数)

参考代码

// 使用后缀法`Math.abs`求绝对值
scala> Math.abs(-1)
res3: Int = 1

1.4.2 中缀调用法

语法

对象名 方法名 参数
scala> Math abs -1
res4: Int = 1

操作符即方法

来看一个表达式

1 + 1

大家觉得上面的表达式像不像方法调用?

在scala中,+ - * / %等这些操作符和Java一样,但在scala中,

  • 所有的操作符都是方法
  • 操作符是一个方法名字是符号的方法

1.4.3 花括号调用法

语法

//方法只有一个参数,才能使用花括号调用法
Math.abs{ 
    // 表达式1
    // 表达式2
}
eg:
scala> Math.abs{-10}
res13: Int = 10

1.4.4 无括号调用法

如果方法没有参数,可以省略方法名后面的括号

示例

  • 定义一个无参数的方法,打印"hello"
  • 使用无括号调用法调用该方法

参考代码

scala> def noReturn() = println("我没有参数")
noReturn: ()Unit

scala> noReturn
我没有参数

2. 函数

2.1 定义函数

语法

1、函数是一个对象(变量)
2、类似于方法,函数也有输入参数和返回值
3、函数定义不需要使用`def`定义
4、无需指定返回值类型
val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体

参考代码

scala> val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>

scala> add(1,2)
res3: Int = 3

2.2 方法和函数的区别

  • 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
  • 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中
  • 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法。方法则没有

2.3 方法转换为函数

  • 有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数

  • 使用_即可将方法转换为函数

参考代码

scala> def add(x:Int,y:Int)=x+y
add: (x: Int, y: Int)Int

// 在方法名之后加上 空格+_
scala> val a = add _
a: (Int, Int) => Int = <function2>