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 } ) }