生活随笔
收集整理的這篇文章主要介紹了
Scala _03方法与函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、Scala方法的定義
?
package com.henu.scala02object DefDemo01 {def main(args: Array[String]): Unit = {def fun(a :Int,b :Int): Unit = {println(a+b)}fun(10,20)def fun1(a :Int ,b :Int) = a+bprintln(fun1(100,200))}}
注意點(diǎn):
方法定義語法 用def來定義可以定義傳入的參數(shù),要指定傳入?yún)?shù)的類型方法可以寫返回值的類型也可以不寫,會(huì)自動(dòng)推斷,有時(shí)候不能省略,必須寫,比如在遞歸方法中或者方法的返回值是函數(shù)類型的時(shí)候。scala中方法有返回值時(shí),可以寫return,也可以不寫return,會(huì)把方法中最后一行當(dāng)做結(jié)果返回。當(dāng)寫return時(shí),必須要寫方法的返回值。如果返回值可以一行搞定,可以將{}省略不寫傳遞給方法的參數(shù)可以在方法中使用,并且scala規(guī)定方法的傳過來的參數(shù)為val的,不是var的。如果去掉方法體前面的等號(hào),那么這個(gè)方法返回類型必定是Unit的。這種說法無論方法體里面什么邏輯都成立,scala可以把任意類型轉(zhuǎn)換為Unit.假設(shè),里面的邏輯最后返回了一個(gè)string,那么這個(gè)返回值會(huì)被轉(zhuǎn)換成Unit,并且值會(huì)被丟棄。
2、遞歸方法
5的階乘
3、參數(shù)有默認(rèn)值的方法
默認(rèn)值的函數(shù)中,如果傳入的參數(shù)個(gè)數(shù)與函數(shù)定義相同,則傳入的數(shù)值會(huì)覆蓋默認(rèn)值。如果不想覆蓋默認(rèn)值,傳入的參數(shù)個(gè)數(shù)小于定義的函數(shù)的參數(shù),則需要指定參數(shù)名稱。
package com.henu.scala02object ParDemo {/*** 包含默認(rèn)參數(shù)值的函數(shù)* 注意:* 1.默認(rèn)值的函數(shù)中,如果傳入的參數(shù)個(gè)數(shù)與函數(shù)定義相同,則傳入的數(shù)值會(huì)覆蓋默認(rèn)值* 2.如果不想覆蓋默認(rèn)值,傳入的參數(shù)個(gè)數(shù)小于定義的函數(shù)的參數(shù),則需要指定參數(shù)名稱*/def main(args: Array[String]): Unit = {def fun(a :Int = 10,b :Int): Unit ={println(a+b)}fun(b = 2)}
}
4、可變參數(shù)的方法
/*** 可變參數(shù)個(gè)數(shù)的函數(shù)* 注意:多個(gè)參數(shù)逗號(hào)分開*/def main(args: Array[String]): Unit = {def fun(elements: Int*)={var sum = 0;for (elem <- elements){sum += elem}sum}println(fun(1,2,3,4,5))}
5、匿名函數(shù)
- 有參匿名函數(shù)
- 無參匿名函數(shù)
- 有返回值的匿名函數(shù)
可以將匿名函數(shù)返回給val定義的值匿名函數(shù)不能顯式聲明函數(shù)的返回類型
package com.henu.scala02object NimingFun {/*** 匿名函數(shù)* 1.有參數(shù)匿名函數(shù)* 2.無參數(shù)匿名函數(shù)* 3.有返回值的匿名函數(shù)* 注意:* 可以將匿名函數(shù)返回給定義的一個(gè)變量*/def main(args: Array[String]): Unit = {//有參匿名val value1 = (a : Int) => {println(a)}value1(5)//無參匿名函數(shù)val value2 = () => {println("我是喬治大哥")}value2()//有返回值的匿名函數(shù)var value3 = (a:Int,b:Int) =>{a+b}println(value3(10,20))}
}
?6、嵌套方法
package com.henu.scala02//【注】返回值為函數(shù)則需指明返回類型
object QianTaoFun {def main(args: Array[String]): Unit = {def fun1(num:Int)={def fun2(a:Int,b:Int):Int={if(a == 1){b}else{fun2(a-1,a*b)}}fun2(num,1)}println(fun1(5))}
}
7、偏應(yīng)用函數(shù)
偏應(yīng)用函數(shù)是一種表達(dá)式,不需要提供函數(shù)需要的所有參數(shù),只需要提供部分,或不提供所需參數(shù)。
package com.henu.scala02import java.util.Dateobject PianFun {def main(args: Array[String]): Unit = {/*** 偏應(yīng)用函數(shù)*/def log(date :Date,s :String)= {println("date is " + date + ", log is " + s)}val date = new Date()log(date,"log1")log(date,"log2")log(date,"log3")//想要調(diào)用log,以上變化的是第二個(gè)參數(shù),可以用偏應(yīng)用函數(shù)處理val logDate = log(date,_:String)logDate("log11")logDate("log22")logDate("log33")}
}
?8、高階函數(shù)
函數(shù)的參數(shù)是函數(shù),或者函數(shù)的返回類型是函數(shù),或者函數(shù)的參數(shù)和函數(shù)的返回類型是函數(shù)的函數(shù)。
函數(shù)的參數(shù)是函數(shù)函數(shù)的返回是函數(shù)函數(shù)的參數(shù)和函數(shù)的返回是函數(shù)
package com.henu.scala02object GaoJieFun {def main(args: Array[String]): Unit = {//函數(shù)的參數(shù)是函數(shù)def fun1(f : (Int,Int) =>Int,a :Int) = {f(a,100)}def f(v1 :Int,v2 :Int)={v1+v2}println(fun1(f,1))//函數(shù)的返回值是函數(shù)//1,2,3,4def fun2(a :Int,b :Int) : (Int, Int) => Int = {def f2(v1: Int, v2: Int): Int = {v1 + v2 + a + b}f2}println(fun2(1,2)(3,4))//println(fun2(1,2)(3,4))這句話調(diào)用了兩次?//函數(shù)的參數(shù)是函數(shù),函數(shù)的返回值是函數(shù)def fun3(f : (Int,Int) => Int) : (Int,Int) => Int = {f}println(fun3(f)(100,200))println(fun3((a,b) => {a+b})(200,200))//以上這句話還可以寫成這樣//如果函數(shù)的參數(shù)在方法體中只使用了一次 那么可以寫成_表示println(fun3(_+_)(200,200))}
}
9、柯里化函數(shù)
package com.henu.scala02object KeLiHaFun {def main(args: Array[String]): Unit = {def fun(a :Int,b :Int)(c: Int,d: Int) = {a + b + c + d}println(fun(1,2)(3,4))}
}
?
總結(jié)
以上是生活随笔為你收集整理的Scala _03方法与函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。