1. 程式人生 > 實用技巧 >Scala(三)【函數語言程式設計】

Scala(三)【函數語言程式設計】

目錄

一.方法和函式

1.方法

1)基本語法

def 方法名(引數名:引數型別,...):返回值型別 = {方法體}

示例

  def add(x: Int, y: Int): Int = {
    x + y
  }
2)簡化原則

1、方法體中只有一行語句的時候,{ }可以省略

示例

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

2、如果將方法體中最後一行表示式作為方法的返回值,返回值型別可以省略

示例

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

注意

​ 方法體中有return,必須定義方法的返回值型別
​ 遞迴方法必須定義返回值型別

3、如果方法不需要返回值, =可以省略

示例

  def func(x: Int) {
    print(x)
  }

4、如果方法不需要引數,()可以省略

示例

  def func1 = {
    print("hello world")
  }

注意

​ 如果定義方法的時候,沒有(),在呼叫的時候也不能帶上()

​ 如果定義方法的時候有(),呼叫方法的時候()可有可無

​ =、()、{}不能夠同時省略

3)方法引數

1.預設引數

在定義方法的時候,可以給引數一個預設值,後續在呼叫方法的時候,有預設值的引數就可以不用傳參

示例

  def add(y: Int,x: Int = 2, y: Int = 3) = {
    x + y + z
  }
	//不賦值使用預設值
	add(3)

2.帶名引數

指定將值傳遞給哪個引數

   add(x=3,y=4)

3.可變引數

定義func,address引數可變

  def func(name:String,address:String*) ={
    print(s"name:${name},address:${address}")
  }

呼叫可以函式,不能直接傳遞陣列,要通過 陣列名:_* 的形式傳遞

  val arr = List("北京市","豐臺區","槐房村")
  func("zhangsan",arr:_*)
  add(x=3,y=4)

注意

可變引數必須放在引數列表的最後

可變引數不能與預設值、帶名引數一起使用

2.函式

語法: val 函式名 = (引數名:引數型別,..) => {函式體}

簡化: 函式體中只有一行語句的時候,{}可以省略

示例

val func = (x:Int,y:Int) => x+y

3.方法和函式的區別

1)方法可以重寫,函式不可用重寫

2)方法是存在於方法區,函式存在堆中

3)方法可以轉成函式,函式不能轉成方法。

​ 方法轉函式: 方法名 _

 // add方法
 def add(x: Int = 2, y: Int = 3) = {
    x + y
  }
  //將add方法轉fun函式
  val fun = add _ 

但是在Scala中,函式和方法沒有明確的界定:方法就是函式,函式也是物件

二.高階函式

定義:方法/函式引數/返回值 是一個函式

示例

  def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
    fun2(x,y)
  }
  // 定義函式
  val add = (x:Int,y:Int) => x+y
  // 呼叫高階函式fun1
  println(fun1(1, 2, add))

三.匿名函式

定義:沒有名字的函式,一般作為值進行傳遞

示例

  def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
    fun2(x,y)
  }
  //_+_: 簡寫(x:Int,y:Int)=>(x=y)
  fun1(1,2,_+_)

四.柯里化

定義: 有多組引數列表的方法稱之為柯里化方法

示例

def m1(x:Int)(y:Int,z:Int) = x+y+z

演變過程

  def fun1(x:Int):(Int,Int) => Int ={
    (y:Int,z:Int) => x +y+z
  }
  
  fun1(1)(2,3)

五.閉包

定義: 函式體中使用不屬於函式本身的變數,這樣的函式稱之為閉包

示例

val x = 10
val func = (y:Int) => x+y