柚子快報邀請碼778899分享:Scala系列之:函數(shù)式編程
柚子快報邀請碼778899分享:Scala系列之:函數(shù)式編程
Scala系列之:函數(shù)式編程
一、面向?qū)ο缶幊毯秃瘮?shù)式編程二、函數(shù)基本語法三、函數(shù)和方法的區(qū)別四、函數(shù)定義五、函數(shù)參數(shù)六、函數(shù)至簡原則七、匿名函數(shù)
一、面向?qū)ο缶幊毯秃瘮?shù)式編程
面向?qū)ο缶幊蹋?/p>
解決問題,分解對象,行為,屬性,然后通過對象的關(guān)系以及行為的調(diào)用來解決問題。對象:用戶行為:登錄、連接JDBC、讀取數(shù)據(jù)庫屬性:用戶名、密碼Scala語言是一個完全面向?qū)ο缶幊陶Z言。萬物皆對象對象的本質(zhì):對數(shù)據(jù)和行為的一個封裝。
函數(shù)式編程:
面向過程編程: 分析解決問題所需要的步驟, 然后用函數(shù)把這些步驟一一實現(xiàn);
二、函數(shù)基本語法
基本語法:
三、函數(shù)和方法的區(qū)別
為完成某一功能的程序語句的集合,稱為函數(shù)類中的函數(shù)稱為方法Scala語言可以在任何的語法結(jié)構(gòu)中聲明任何的語法函數(shù)沒有重載和重寫的概念。方法可以進(jìn)行重載和重寫Scala中函數(shù)可以嵌套定義
四、函數(shù)定義
函數(shù)1:無參,無返回值函數(shù)2:無參,有返回值函數(shù)3:有參,無返回值函數(shù)4:有參,有返回值函數(shù)5:多參,無返回值函數(shù)6:多參,有返回值
package com.bigdata
object function {
def main(args: Array[String]): Unit = {
//函數(shù)1:無參,無返回值
def f1(): Unit = {
println("函數(shù)1:無參數(shù),無返回值")
}
f1()
//函數(shù)2;無參,有返回值
def f2(): Int = {
println("函數(shù)2:無參,有返回值")
return 12
}
println(f2())
//函數(shù)3:有參數(shù),無返回值
def f3(name: String): Unit = {
println("函數(shù)3:有參數(shù),無返回值 " + name)
}
f3("好好學(xué)scala")
//函數(shù)4:有參數(shù),有返回值
def f4(name: String): String = {
println("函數(shù)4:有參數(shù),有返回值 " + name)
return "好好學(xué)scala " + name
}
println(f4("加油"))
//函數(shù)5:多參數(shù),無返回值
def f5(name: String, hobby: String): Unit = {
println("函數(shù)5:多參數(shù),無返回值")
println(name + "喜歡" + hobby)
}
f5("飛", "足球")
//函數(shù)6:多參數(shù),有返回值
def f6(a: Int,b: Int): Int = {
println("函數(shù)6:多參數(shù),有返回值")
return a + b
}
println(f6(3,6))
}
}
輸出如下所示:
函數(shù)1:無參數(shù),無返回值
函數(shù)2:無參,有返回值
12
函數(shù)3:有參數(shù),無返回值 好好學(xué)scala
函數(shù)4:有參數(shù),有返回值 加油
好好學(xué)scala 加油
函數(shù)5:多參數(shù),無返回值
飛喜歡足球
函數(shù)6:多參數(shù),有返回值
9
五、函數(shù)參數(shù)
可變參數(shù)如果參數(shù)列表中存在多個參數(shù),可變參數(shù)一般放置在最后參數(shù)默認(rèn)值,一般將有默認(rèn)值的參數(shù)放置在參數(shù)列表的后面帶名參數(shù)
package com.bigdata
object function {
def main(args: Array[String]): Unit = {
//1.可變參數(shù)
def f7(str: String*): Unit = {
println(str)
}
f7("足球")
f7("足球","羽毛球")
//2.參數(shù)列表中存在多個參數(shù),那么可變參數(shù)一般放置在最后
def f8(str1: String,str2: String*): Unit = {
println("str1: " + str1 + " str2: " + str2)
}
f8("足球","羽毛球","乒乓球")
//3.參數(shù)默認(rèn)值,一般有默認(rèn)值的參數(shù)放置在參數(shù)列表的后面
def f9(name: String = "huoying"): Unit = {
println(name)
}
f9()
f9("haizeiwang")
//4.帶名參數(shù)
def f10(name: String = "鳴人", age: Int): Unit = {
println(s"${age}歲的${name}在學(xué)習(xí)")
}
f10("佐助",20)
f10(age = 11,name= "卡卡西")
f10(age=5)
}
}
輸出如下所示:
1??勺儏?shù)
WrappedArray(足球)
1??勺儏?shù)
WrappedArray(足球, 羽毛球)
2。參數(shù)列表中存在多個參數(shù),那么可變參數(shù)一般放置在最后
str1: 足球 str2: WrappedArray(羽毛球, 乒乓球)
3。參數(shù)默認(rèn)值,一般有默認(rèn)值的參數(shù)放置在參數(shù)列表的后面
huoying
3。參數(shù)默認(rèn)值,一般有默認(rèn)值的參數(shù)放置在參數(shù)列表的后面
haizeiwang
4。帶名參數(shù)
20歲的佐助在學(xué)習(xí)
4。帶名參數(shù)
11歲的卡卡西在學(xué)習(xí)
4。帶名參數(shù)
5歲的鳴人在學(xué)習(xí)
六、函數(shù)至簡原則
return可以省略,Scala會使用函數(shù)體的最后一行代碼作為返回值如果函數(shù)體只有一行代碼,可以省略花括號返回值類型如果能夠推斷出來,那么可以省略,:和返回值類型一起省略如果有return,則不能省略返回值類型,必須指定如果函數(shù)明確聲明unit,那么即使函數(shù)體中使用return關(guān)鍵字也不起作用Scala如果期望是無返回值類型,可以省略等號如果函數(shù)無參,但是聲明了參數(shù)列表,那么調(diào)用時,小括號,可加可不加如果函數(shù)沒有參數(shù)列表,那么小括號可以省略,調(diào)用時小括號必須省略如果不關(guān)心名稱,只關(guān)心邏輯處理,那么函數(shù)名def可以省略
object function2 {
def main(args: Array[String]): Unit = {
//1.return可以省略,Scala會使用函數(shù)體的最后一行代碼作為返回值
def f1(name: String): String = {
return name
}
println(f1("足球"))
def f1bak(name :String): String = {
name
}
println(f1bak("籃球"))
// 2. 如果函數(shù)體只有一行代碼,可以省略花括號
def f2(name: String): String = name
println(f2("羽毛球"))
//3. 返回值類型如果能夠推斷出來,那么可以省略,:和返回值類型一起省略
def f3(name: String) = name
println(f3("水球"))
//4. 如果有return,則不能省略返回值類型,必須指定
def f4(name: String): String = {
return name
}
//5. 如果函數(shù)明確聲明unit,那么即使函數(shù)體中使用return關(guān)鍵字也不起作用
def f5(name: String): Unit = {
return name
}
println(f5("哈哈"))
//6. Scala如果期望是無返回值類型,可以省略等號
def f6(name: String) {
println(f6("水球"))
}
//7. 如果函數(shù)無參,但是聲明了參數(shù)列表,那么調(diào)用時,小括號,可加可不加
def f7(): Unit = {
println("強(qiáng)啊")
}
f7
// 8. 如果函數(shù)沒有參數(shù)列表,那么小括號可以省略,調(diào)用時小括號必須省略
def f8: Unit = {
println(" 8. 如果函數(shù)沒有參數(shù)列表,那么小括號可以省略,調(diào)用時小括號必須省略")
}
f8
// 9.如果不關(guān)心名稱,只關(guān)心邏輯處理,那么函數(shù)名def可以省略
def f9(name: String): Unit = {
println(name)
}
//匿名函數(shù),lambda表達(dá)式
(name: String) => {println(name)}
}
}
七、匿名函數(shù)
沒有名字的函數(shù)就是匿名函數(shù)(x:Int)=>{函數(shù)體}x:表示輸入?yún)?shù)類型Int:表示輸入?yún)?shù)類型函數(shù)體:表示具體代碼邏輯
匿名函數(shù)的至簡原則
object LambdaTest {
def main(args: Array[String]): Unit = {
val fun = (name: String) => {println(name)}
fun("籃球")
//匿名函數(shù)作為參數(shù)
def f(func: String => Unit): Unit = {
func("足球")
}
f(fun)
println("--------")
f((name: String) => {println(name)})
}
}
匿名函數(shù)的至簡原則
參數(shù)的類型可以省略,會根據(jù)形參進(jìn)行自動推導(dǎo)類型省略后,發(fā)現(xiàn)只有一個參數(shù),則圓括號可以省略。其他情況,沒有參數(shù)和參數(shù)超過1的永遠(yuǎn)不能省略圓括號。匿名函數(shù)如果只有一行,則大括號也可以省略如果參數(shù)只出現(xiàn)一次,則參數(shù)省略且后面參數(shù)可以用_代替。如果可以推斷出,當(dāng)前傳入的println是一個函數(shù)體,而不是調(diào)用語句,可以直接省略下劃線
object LambdaTest {
def main(args: Array[String]): Unit = {
val fun = (name: String) => {println(name)}
fun("籃球")
//匿名函數(shù)作為參數(shù)
def f(func: String => Unit): Unit = {
func("足球")
}
f(fun)
println("--------")
f((name: String) => {println(name)})
//1。參數(shù)的類型可以省略,會根據(jù)形參進(jìn)行自動推導(dǎo)
f((name) => {println(name)})
//2。類型省略后,發(fā)現(xiàn)只有一個參數(shù),則圓括號可以省略。其他情況,沒有參數(shù)和參數(shù)超過1的永遠(yuǎn)不能省略圓括號。
f(name => {println(name)})
//3。匿名函數(shù)如果只有一行,則大括號也可以省略
f(name => println(name))
//4. 如果參數(shù)只出現(xiàn)一次,則參數(shù)省略且后面參數(shù)可以用_代替。
f(println(_))
//5.如果可以推斷出,當(dāng)前傳入的println是一個函數(shù)體,而不是調(diào)用語句,可以直接省略下劃線
f(println)
}
}
二元函數(shù)使用示例:
object LambdaTest {
def main(args: Array[String]): Unit = {
println("-----------------")
//定義一個二元運(yùn)算函數(shù),只操作1和2兩個數(shù),具體運(yùn)算通過參數(shù)傳入
def dualFunctionOneAndTwo(fun:(Int,Int)=>Int): Int = {
fun(1,2)
}
val add = (a:Int,b:Int) => a + b
val minus = (a:Int,b:Int) => a - b
println(dualFunctionOneAndTwo(add))
println(dualFunctionOneAndTwo(minus))
//二元函數(shù)簡化
println("-------------二元函數(shù)簡化----------")
println(dualFunctionOneAndTwo(_ + _))
println(dualFunctionOneAndTwo(_ - _))
println(dualFunctionOneAndTwo(-_ + _))
}}
輸出如下所示:
-----------------
3
-1
-------------二元函數(shù)簡化----------
3
-1
1
柚子快報邀請碼778899分享:Scala系列之:函數(shù)式編程
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。