1. 定義方法和函數
1.1. 定義方法
方法的返回值類型可以不寫,編譯器可以自動推斷出來,但是對於遞歸函數,必須指定返回類型
1.2. 定義函數
1.3.方法和函數的區別
在函數式編程語言中,函數是“頭等公民”,它可以像任何其他數據類型一樣被傳遞和操作
案例:首先定義一個方法,再定義一個函數,然后將函數傳遞到方法里面
package cn.toto.scala /** * Created by toto on 2017/6/27. */ object MethodAndFunctionDemo { //定義一個方法 //方法m2參數要求是一個函數,函數的參數必須是兩個Int類型 //返回值類型也是Int類型 def m1(f:(Int,Int) => Int) : Int = { f(2,6) } //定義一個函數f1,參數是兩個Int類型,返回值是一個Int類型 val f1 = (x:Int,y:Int) => x + y //再定義一個函數f2 val f2 = (m:Int,n:Int) => m * n //main方法 def main(args: Array[String]): Unit = { //調用m1方法,並傳入f1函數 val r1 = m1(f1) println(r1) //調用m1方法,並傳入f2函數 val r2 = m1(f2) println(r2) } }
運行結果:
8
12
1.2. 將方法轉換成函數(神奇的下划線)
代碼如下:
package cn.toto.scala
/**
* Created by toto on 2017/6/27. */ object TestMap { def ttt(f:Int => Int):Unit = { val r = f(10) println(r) } val f0 = (x : Int) => x * x //定義了一個方法 def m0(x:Int) : Int = { //傳遞進來的參數乘以10 x * 10 } //將方法轉換成函數,利用了神奇的下滑線 val f1 = m0 _ def main(args: Array[String]): Unit = { ttt(f0) //通過m0 _將方法轉化成函數 ttt(m0 _); //如果直接傳遞的是方法名稱,scala相當於是把方法轉成了函數 ttt(m0) //通過x => m0(x)的方式將方法轉化成函數,這個函數是一個匿名函數,等價:(x:Int) => m0(x) ttt(x => m0(x)) } }
-------------------------
package com.cx.spark.demo
object MethodAndFunction {
def main(args: Array[String]): Unit = {
println(timeUUId)
}
//定義一個方法
//方法m2參數要求是一個函數,函數的參數必須是兩個Int類型
//返回值類型也是Int類型
def m1(f: (Int, Int) => Int): Int = {
f (2, 6)
}
//定義一個函數f1,參數是兩個Int類型,返回值是一個Int類型
val f1 = (x: Int, y: Int) => x + y
//再定義一個函數f2
val f2 = (m: Int, n: Int) => m * n
def max(a: Int, b: Int):Int = if (a > b) a else b //定義方法
val a: (Int, Int) => Int = max //max會隱士轉化成函數,賦給變量(函數是一等公民),變量必須要指定參數類型
//val a: (Int, Int) => Int = max() //報錯
var b = max _ //主動把方法轉成函數,賦個變量,不用指定函數參數
var doubler = (x: Int) => x + 10 //定義函數
var c = doubler //函數間賦值
def hf():Int => Int = x => x+1 //定義一個方法,參數:空;返回值:參數為Int的函數
var d = hf() //調用函數,返回值(函數)賦給一個變量
var e = hf //括號省略了
//Partial Functions 偏函數
val pf : PartialFunction[Int , String] = {
case 1 => "One"
case 2 => "Two"
case _ => "Other"
}
val pf2 :Int => String = {
case 1 => "One"
case 2 => "Two"
case _ => "Other"
}
def safeStringOp(s:String, f:String=>String) = {
if (s != null) f(s) else s
}
//匿名函數
val uuid = java.util.UUID.randomUUID().toString
val timeUUId = safeStringOp(uuid,
{ s =>
val now = System.currentTimeMillis
val timed = s.take(24) + now
timed.toUpperCase
}
)
}
