Scala之柯里化和閉包
阿新 • • 發佈:2020-12-16
Scala之柯里化和閉包
一、匿名函式
沒有名字的函式就是匿名函式,可以直接通過函式字面量(表示式)來設定匿名函式,函式字面量定義格式如下。
二、函式柯里化&閉包
函式柯里化:將一個接收多個引數的函式轉化成一個接受一個引數的函式過程,可以簡單的理解為一種特殊的引數列表宣告方式。
閉包:就是一個函式和與其相關的引用環境(變數)組合的一個整體(實體)
三、案例
package com.scala.charpter05
object NoName {
def main(args: Array[String]): Unit = {
//匿名函式
/**
* 匿名函式: 沒有函式名的函式
* 匿名函式都是作為引數值傳遞給高階函式的
*/
println(add(10, 20, (x: Int, y: Int) => x + y))
//方法就是函式
println(add(30,50,m))
println("==================================")
//柯里化
/**
* 柯里化: 有多個引數列表的方法稱之為柯里化
* 函式是物件,
*/
println(add(10, 20)(30)(40))
val func: Int => Int => Int = add2(10,20)
val func2: Int => Int = func(30)
println(func2(40))
println(add3(10, 20)(30)(40))
/**
* 閉包: 函式體中使用了不屬於自身的變數的函式/方法
*/
println("===============================")
m1(10,x=>x)
val func3: (Int => Int) => Int = m1(10,_)
println(func3(x=>x))
val func4 = (func3:Int=>Int)=>{
func3(10)
}
println(func4(x=>x))
}
def add(x:Int,y:Int,func:(Int,Int)=>Int)=func(x,y)
def m(x:Int,y:Int)=x*y
//有多個引數列表
def add(x:Int,y:Int)(z:Int)(a:Int)=x+y+z+a
/**
* 柯里化演變過程
* @param x
* @param y
* @return
*/
def add2(x:Int,y:Int)={
val func1=(z:Int)=>{
val func2=(a:Int)=>x+y+z+a
func2
}
func1
}
def add3(x:Int,y:Int)={
(z:Int)=>{
(a:Int)=>x+y+z+a
}
}
//閉包測試所用函式
def m1(x:Int,func:Int=>Int)=func(x)
}