Scala 高階函式

2021-08-14 15:34:57 字數 3658 閱讀 3470

import

scala.math._

val num = 3.14val func = ceil _ //

_意味著確實指的是這個函式,而不是忘記了傳引數 ,func是乙個函式變數,內容儲存的是個函式

val v =func(num)

println(v)

val arr = array(1.0,3.14,4).map(func) //

將函式func傳遞給map方法,將他應用到陣列中的所有值,然後返回結果陣列

for(i

結果:4.0

1.0 4.0 4.0

val func = (x:double) => x*3 //匿名函式

val arr1 = array(2.0,4,6).map((x:double)=> x*3) //

匿名函式

val arr2 = array(2.0,4,6).map //

匿名函式,可以將函式用{}括起來

val arr3 = array(2.0,4,6) map //

匿名函式,中置表示法,可以不用句號

for(i

import

scala.math._

def valueatfunc(f: (double) => double) =

println(valueatfunc(ceil _))

//將函式傳遞個 函式valueatfunc

println(valueatfunc(sqrt _))

結果:

1.0

0.5

import

scala.math._

def valueatfunc(f: (double) => double) =

println(valueatfunc(ceil _))

//將函式傳遞個 函式valueatfunc

println(valueatfunc(sqrt _))

valueatfunc((x:double) => x*3 ) //

匿名函式,指定型別

valueatfunc((x)=>x*3) //

匿名函式,已知引數型別

valueatfunc(x=>x*3) //

匿名函式,已知引數型別,去掉括號

valueatfunc(_*3) //

使用_替換 x

val f1 = 3 * _ //

錯誤,沒指定型別

val f2 = 3 *(_:double) //

ok val f3:(double)=>double = 3 * _ //

ok 指定了f3型別

匿名函式簡寫:

valueatfunc((x:double) => x*3 ) //匿名函式,指定型別

valueatfunc((x)=>x*3) //匿名函式,已知引數型別

valueatfunc(x=>x*3) //匿名函式,已知引數型別,去掉括號

valueatfunc(_*3) //使用_替換 x

map這個方法將乙個函式應用到某個集合的所有元素並返回結果

foreach將函式應用到每個元素,並不返回結果

(0 to 9).map("*" * _).foreach(println(_))
結果:

*

*****

****

*****

******

*******

********

*********

filter輸出所有匹配某個特定條件的元素

(0 to 9).filter(_ % 2 == 0).foreach(println(_))
結果:

024

68

reduceleft方法接收乙個二元函式,從左到右遍歷元素

println((0 to 9).reduceleft(_ + _))   //

相當於 (...((((0+1) + 2) + 3) + 4) ...+ 9)

結果

45
sortwith方法二元排序

"i am a bad guy".split(" ").sortwith(_.length<_.length>

結果:iaam

badguy

閉包由**和**用到的非區域性變數定義構成

single abstract method

currying,指的是將原本接收兩個引數的函式變成新的接收乙個引數的函式的過程。

def mul(x:int, y:int) = x * y  //

接收兩個引數的函式

def muloneatatime(x:int) = (y:int)=> x * y //

接收乙個引數的函式,需要接收兩次引數

def muloneatatime1(x:int)(y:int) = x * y //

柯里化 簡寫

println(muloneatatime(3)(4))

println(muloneatatime1(3)(4))

柯里化用途:

傳遞乙個引數呼叫函式,有助於對引數型別進行推斷,即型別推斷

val a = array("hello","world")

val b = array("hello","world")

a.corresponds(b)(_.equalsignorecase(_))

scaladoc說明

that是string型別的序列,所以第二個函式引數是(string, string) => boolean,所以適用函式_.equalsignorecase(_)傳遞兩個string型別引數的函式。

實現類似while條件控制,柯里化實現

//

until函式 類似於while

def until(condition: => boolean) (block: => unit)

} var x:int = 10until(x > 0)

結果:

987

6543210

//

until函式 類似於while

def until(condition: => boolean) (block: => unit)

} var x:int = 10until(x > 0)

def indexof(str: string, ch:char): int =的until

i+=1}

return -1}

println(indexof("hello", 'i'))

return在控制抽象中很有用。

Scala高階函式

在scala中,無法直接操縱方法,只能直接操縱函式,所以需要使用 import scala math.val temp ceil val num 3.14 println fun temp num temp的型別是 double double,意為接受double引數並返回double的函式。能夠對...

Scala高階函式

高階函式 higher order function 高階函式可以使用其他函式作為引數,進入方法內使用,或者使用函式輸出結果作為引數。object demo 函式1,返回當前時間納秒數,long型別 def time t long 可以簡寫為t long,long表示如果傳入引數為方法時返回值為lo...

Scala 高階函式

1 定義 當乙個函式包含其他函式作為其引數或者返回結果為乙個函式時,該函式被稱為高階函式 2 不採用高階函式,使用遞迴實現下面功能 2的a次方 def poweroftwo a int int 計算乙個整數到另乙個整數的連加和 def sumints x int,y int int 計算乙個整數到另...