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
17scala> 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
8scala> 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
13scala> 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
10scala> 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
2scala> val doubler: Int => Int = _*2
doubler: Int => Int = $$Lambda$916/817785349@6812708d
再舉個例子:1
2
3
4
5scala> 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
8scala> 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
18scala> 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
函式的寫法方式非常多種,不常接觸真的不太好理解。
這次先到這邊,下次再跟大家介紹 集合
喔!有問題歡迎寄信跟我討論。
Donate
謝謝您的支持與鼓勵