Scala教學(五)進階函式

上一篇跟大家介紹了基本的函式做法,這次要跟大家介紹進階用法了。

Quick Start

接下來將要分享我的Scala學習筆記,有任何建議與需要改進的地方,也請大家多多指教。

參考書籍Learning Scala

進階函式(Fist-Class Functions)

函式可以接受另一個函式當作是參數,也可以 return 一個函式。

  • A Function Type

    ([<type>, …]) => <type>

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
scala> def double(x: Int): Int = x * 2
double: (x: Int)Int

scala> double(5)
res0: Int = 10

scala> val myDouble: (Int) => Int = double
myDouble: Int => Int = $$Lambda$806/1769616559@70211df5

scala> myDouble(5)
res2: Int = 10

scala> val myDoubleCopy = myDouble
myDoubleCopy: Int => Int = $$Lambda$806/1769616559@70211df5

scala> myDoubleCopy(5)
res5: Int = 10

  • 使用 _ 賦予 function

    val <identifier> = <function name> _

範例:

1
2
3
4
5
6
7
8
scala> def double(x: Int): Int = x * 2
double: (x: Int)Int

scala> val myDouble = double _
myDouble: Int => Int = $$Lambda$894/668330752@2b540131

scala> val amount = myDouble(20)
amount: Int = 40

  • 使用 function 進行參數傳遞

範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
scala> def stringops(s: String, f: String => String) = {
| if(s!=null) f(s) else s
| }
stringops: (s: String, f: String => String)String

scala> def reverser(s: String) = s.reverse
reverser: (s: String)String

scala> stringops(null, reverser)
res6: String = null

scala> stringops("Hello", reverser)
res7: String = olleH

  • 使用 Placeholder Syntax
    Placeholder Syntax 是一個可以使用 _ 當作 function 的參數使用方式。
    使用的時機分(1)在外部定義明確的函式類型使用 _ 取代參數 (2)參數使用不超過一次時,可以使用。

範例(1)如:

1
2
3
4
5
6
7
8
9
10
scala> def stringOps(s:String, f:String => String) = {
| if(s!=null) f(s) else s
| }
stringOps: (s: String, f: String => String)String

scala> stringOps(null, _.reverse)
res8: String = null

scala> stringOps("Hello", _.reverse)
res10: String = olleH

範例(2)如:

1
2
scala> val doubler: Int => Int = _*2
doubler: Int => Int = $$Lambda$916/817785349@6812708d

再舉個例子:

1
2
3
4
5
scala> def combination(x: Int, y: Int, f: (Int,Int) => Int) = f(x,y)
combination: (x: Int, y: Int, f: (Int, Int) => Int)Int

scala> combination(11, 12, _ * _)
res11: Int = 132

進階用法:

1
2
3
4
5
6
7
8
scala> def factorOf(x: Int, y: Int) = y % x == 0
factorOf: (x: Int, y: Int)Boolean

scala> val f = factorOf _
f: (Int, Int) => Boolean = $$Lambda$923/1410723144@636787fd

scala> val x = f(7, 20)
x: Boolean = false

  • 使用 By-Name Parameters
    語法是:

    <identifier>: => <type>

與個例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
scala> def doubles(x: => Int) = {
| println("Now doubling " + x)
| x* 2
| }
doubles: (x: => Int)Int

scala> doubles(5)
Now doubling 5
res12: Int = 10

scala> def f(i: Int) = { println(s"Hello from f($i)"); i }
f: (i: Int)Int

scala> doubles( f(8) )
Hello from f(8)
Now doubling 8
Hello from f(8)
res13: Int = 16

函式的寫法方式非常多種,不常接觸真的不太好理解。
這次先到這邊,下次再跟大家介紹 集合 喔!有問題歡迎寄信跟我討論。

謝謝您的支持與鼓勵

Ads