Scala方法與函數(shù)使用和定義詳解
一、方法的定義
1.方法體中最后返回值可以使用return, 如果使用了return, 那么方法體的返回值類型一定要指定
2.如果方法體重沒有return, 默認將 方法體中最后一行計算的結果當作返回值返回. 方法體的返回值可以省略, 會自動推斷
3.定義方法傳入的參數(shù)一定要指定類型
4.方法的方法體如果只有一行, 那么方法體的“{…}”可以省略
5.如果定義方法時, 省略了方法名稱和方法體之間的"=", 那么無論方法體最后一行計算的結果是什么, 都會被丟棄, 返回Unit
def max(a: Int, b: Int) = {
if (a > b) {
"哈哈"
} else {
b
}
}
// 語法糖: 方法定義
def max0(a: Int, b: Int) = if (a > b) a else b注:記住def定義的格式,按著格式敲即可,不要糾結
二、遞歸方法
遞歸方法必須要顯示指定返回體的類型
def fun2(num: Int): Int = {
if (num == 1)
num
else
num * fun2(num - 1)
}
// 語法糖
def fun2(num:Int) : Int = if (num == 1) num else num * fun2(num - 1)注:編譯器無法直接推斷出你最終遞歸的結果類型,所以需要你顯示指定
三、參數(shù)有默認值的方法
1.默認值的函數(shù)中,如果傳入的參數(shù)個數(shù)與函數(shù)定義相同,則傳入的數(shù)值會覆蓋默認值
2.如果不想覆蓋默認值,傳入的參數(shù)個數(shù)小于定義的函數(shù)的參數(shù),則需要指定參數(shù)名稱
def fun3(a: Int = 10, b: Int) = {
println(a + b)
}
四、可變參數(shù)個數(shù)的函數(shù)
多個參數(shù)之間逗號分開
def fun4(elements: Int*) = {
println(elements)
elements.foreach(i => println(i))
// 當匿名函數(shù)的元素只用到一次的時候, 可以用_簡寫
elements.foreach(println(_))
// 當方法入?yún)閱蝹€參數(shù)時且正好是匿名函數(shù)的元素時, 進一步簡寫
elements.foreach(println)
var sum = 0;
for (elem <- elements) {
sum += elem
}
sum
}五、匿名函數(shù)
注意函數(shù)的寫法與方法的寫法有些許的不同,出現(xiàn) => 符號就認為是函數(shù),但實際使用上效果并無不同,僅僅是語法上的細微區(qū)別
原生的匿名函數(shù)寫法(基本不用):(Int, Int) => Int就是他的類型
/**
* 原生的匿名函數(shù)寫法(基本不用)
* @return
*/
def fun: (Int, Int) => Int = (a: Int, b: Int) => {
a + b
}
常用的匿名函數(shù)寫法: 可以將匿名函數(shù)返回給定義的一個變量, 看到“=>”就是匿名函數(shù), 多用于方法的參數(shù)是函數(shù)時(函數(shù)指針),用匿名函數(shù)簡寫
/**
* 常用的匿名函數(shù)寫法: 可以將匿名函數(shù)返回給定義的一個變量, 看到“=>”就是匿名函數(shù)
* 多用于方法的參數(shù)是函數(shù)時(函數(shù)指針),用匿名函數(shù)簡寫
*
* @param args
*/
def main(args: Array[String]): Unit = {
/**
* 有參數(shù)匿名函數(shù)
*/
val value1: (Int) => Unit = (a: Int) => {
println(a)
}
value1(1)
/**
* 無參數(shù)匿名函數(shù)
*/
val value2 = () => {
println("我愛學習")
}
value2()
/**
* 有返回值的匿名函數(shù)
*/
val value3 = (a: Int, b: Int) => {
a + b
}
println(value3(4, 4))
}六、嵌套方法
/**
* 嵌套方法
* 例如:嵌套方法求5的階乘
*/
def fun5(num: Int) = {
def fun6(a: Int, b: Int): Int = {
if (a == 1) {
b
} else {
fun6(a - 1, a * b)
}
}
fun6(num, 1)
}
七、偏應用函數(shù)(部分應用函數(shù))
某些情況下, 方法中參數(shù)非常多, 調(diào)用這個方法非常頻繁, 每次調(diào)用只有固定的某個參數(shù)變化, 其他都不變, 可以定義偏應用來實現(xiàn)
def showLog(date :Date, log :String)= {
println(s"date is $date, log is $log")
}
def main(args: Array[String]): Unit = {
val date = DateUtil.date(new Date())
showLog(date,"當前時間")
// 想要調(diào)用log, 以上變化的是第二個參數(shù), 可以用偏應用函數(shù)處理
// 把showLog()方法定義為偏應用函數(shù)
val logWithDate = showLog(date,_:String)
// 第二種函數(shù)寫法
def logWithDate2 = showLog(date,_:String)
logWithDate("偏應用函數(shù)-log11")
logWithDate("偏應用函數(shù)-log22")
logWithDate("偏應用函數(shù)-log33")
}
八、高階函數(shù)
函數(shù)的參數(shù)是函數(shù),或者函數(shù)的返回類型是函數(shù),或者函數(shù)的參數(shù)和函數(shù)的返回類型是函數(shù)的函數(shù).
/**
* 普通的方法
*
* @param a
* @param b
* @return
*/
def fun(a: Int, b: Int): Int = {
a + b
}
/**
* 使用 _把方法強轉為一個函數(shù)
*/
private val function: (Int, Int) => Int = fun _
/**
* 函數(shù)的參數(shù)是函數(shù): 函數(shù)的類型 (Int, Int) => Int, 記住: 方法的引用僅為方法本身,需要重新賦實參
*
* @param f 函數(shù)作為參數(shù)
* @param a
* @return
*/
def fun1(f: (Int, Int) => Int, a: Int): Int = {
f(a, 100)
}
/**
* 函數(shù)的返回是函數(shù): 必須要顯示地寫出返回值類型, 或者使用 f2 _
*
* @param a
* @param b
* @return
*/
def fun2(a: Int, b: Int): (Int, Int) => Int = {
// 在內(nèi)部定義了一個方法
def f2(v1: Int, v2: Int): Int = {
v1 + v2 + a + b
}
f2
}
/**
* 函數(shù)的參數(shù)是函數(shù),函數(shù)的返回是函數(shù)
*
* @param f
* @return
*/
def fum3(f: (Int, Int) => Int): (String, String) => String = {
val i = f(1, 2)
def fun1(s1: String, s2: String): String = {
s1 + "@" + s2 + "$" + i
}
fun1
}
/**
* 函數(shù)入口
*
* @param args
*/
def main(args: Array[String]): Unit = {
// 顯示聲明過的函數(shù)作為參數(shù)
println("顯示聲明過的函數(shù)作為參數(shù): " + fun1(fun, 100))
// 匿名函數(shù)作為參數(shù): 匿名函數(shù)入?yún)⒌念愋涂梢允÷圆粚?
println("匿名函數(shù)作為參數(shù): " + fun1((a: Int, b: Int) => {
a * b
}, 100))
// 返回值是一個函數(shù)
println("返回值是一個函數(shù): " + fun2(1, 2)(3, 4))
// 入?yún)⒑统鰠⒍际呛瘮?shù)
println("入?yún)⒑统鰠⒍际呛瘮?shù): " + fum3(fun)("hello", "scala!"))
println("入?yún)⒑统鰠⒍际呛瘮?shù): " + fum3((a, b) => a * b)("hello", "scala!"))
}
筆者注:高階函數(shù)這塊內(nèi)容會相對較為難以理解,可以先記住這種結構
九、柯里化函數(shù)
柯里化函數(shù): 本質上就是對返回值是函數(shù)的方法的一種簡化寫法
def fun7(a: Int, b: Int)(c: Int, d: Int) = {
a + b + c + d
}
/**
* 函數(shù)入口
*
* @param args
*/
def main(args: Array[String]): Unit = {
println(fun7(1, 2)(3, 4))
}注:fun7(1, 2)(3, 4)可以理解成先運算fun7(1,2)返回了一個fun7函數(shù)對象,再對他進行參數(shù)(3,4)的賦值
到此這篇關于Scala方法與函數(shù)使用和定義詳解的文章就介紹到這了,更多相關Scala方法與函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java?KeyGenerator.generateKey的19個方法代碼示例
在下文中一共展示了KeyGenerator.generateKey方法的19個代碼示例,這些例子默認根據(jù)受歡迎程度排序2021-12-12
jsch中ChannelShell與ChannelExec的區(qū)別及說明
這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

