溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala方法與函數(shù)的定義及使用

發(fā)布時間:2021-09-04 10:48:04 來源:億速云 閱讀:160 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“scala方法與函數(shù)的定義及使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

scala 方法與函數(shù)

scala方法與函數(shù)的定義及使用

scala方法與函數(shù)的定義及使用

定義方法

定義方法的基本格式是:
def 方法名稱 (參數(shù)列表):返回值類型 = 方法體,Scala中 方法規(guī)則是如果沒有入?yún)t盡量只用方法名定義該方法。

def add(x:Int,y:Int):Int = x+y
//也可以定義成
//def add(x:Int,y:Int)=x+y
//或者
def add(x:Int,y:Int){x+y}
//沒有返回值一定要用大括號那方法體括起來

帶有參數(shù)列表的方法

def addThenMultiply(x:INt,y:Int)(multipier:Int):Int=(x+y)*multipier 
println(addThenMultiply(1,2)(3))

無參數(shù)方法

scala> def name:String = System.getProperty("user.name")
name: String

scala> name
res2: String = apple

scala> name()
<console>:9: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
              name()
                  ^

scala> def name():String = System.getProperty("user.name")
name: ()String

scala> name()
res4: String = apple

scala> name
res5: String = apple

方法體是多行語句的表達式

def getSquareString(input:Double):String = {
	val square =input*input
	square.toString
}

帶有默認值的方法

默認參數(shù),可以有多個。對位置不作要求

def method1(a:Int=1,b:Int,c:Int=3)=println("a="+a+"b= "+b+"c="+c)
//調(diào)用
method1(b=2) //不能method1(2)
//或者
method1(1,2)//method1(a=1,b=2)
//或則
method1(1,2,3) //method1(c=1,b=2,a=3)

可變參數(shù)或者不定長參數(shù)

注意1:(可變參數(shù)一定是參數(shù)列表的最后一個參數(shù))
注意2:(函數(shù)內(nèi)部,重復參數(shù)類型是聲明參數(shù)類型的數(shù)組,但是如果給你一個可變參數(shù)的方法傳一個數(shù)組,是會報編譯錯誤 :type mismatch ,可以使用數(shù)組名:_*的方式傳參)

def add(a:Int*)
{ 
   for(i<-a) 
     println(i); 
}

調(diào)用:
add(1,2,3,4,5) 
或者: 
var arr = Array(1,2,3,4,5,8) 
add(arr:_*)

注意:

  1. 方法的返回值類型不可不寫,編譯器可以自動推斷出來,但是對于遞歸函數(shù),必須制定返回類型

  2. 方法的返回值默認是方法體中最后一行表達式的值,方然也可以用return來執(zhí)行返回值,但不推薦這么做

  3. 若使用return來制定函數(shù)的返回值。scala的類型推斷將會失效,要顯式制定返回值類型

  4. 方法也可以沒有返回值(返回值是Unit)
     

定義函數(shù)

給方法傳遞一個函數(shù)類型的參數(shù)(高級靜態(tài)語言):

def foo(f:Int => String) =...
def bar(f:(Boolean,Double)=>List[String]) = ...

函數(shù)定義的方式:

val f1 = ((a:Int,b:Int) =>a+b)
val f2 = (a:Int,b:Int) =>a+b
val f3 = (_:Int)+(_:Int)
val f4 :(Int,Int)=>Int = (_+_)
val f1 = (x:Int,y:Int)=>x+y

//調(diào)用函數(shù)
f1(1,2)

的定義方式:

val f1:(Int,Int)=>Int=(x,y)=>x+y
val f2:((Int,Int)=>Int)={(x,y)=>x+y}

val f1 = new Function2[Int,Int,Int]{
def apply(x:Int,y:Int):Int = if(x<y)y else x
}

匿名函數(shù)

(x:Int)=>x+1

無參函數(shù)

val getTheAnswer =()=>42
println(getTheAnswer())

方法和函數(shù)的區(qū)別
方法和函數(shù)的定義的語法不同
方法一般定義在某個類,特質(zhì),或者object中
方法可以共享所在類內(nèi)的屬性
在函數(shù)式編程語言中,函數(shù)式”頭等公民”,可以調(diào)用它,也可以傳遞它,存放在變量中,或者作為參數(shù)傳遞給另一個函數(shù)

案例:首先定義一個方法,然后將函數(shù)傳遞到方法
 

scala> def m(f:(Int,Int)=>Int) = f(2,6)
m: (f: (Int, Int) => Int)Int

scala> val f2 = (x:Int,y:Int)=>x-y
f2: (Int, Int) => Int = <function2>

m(f2)
res17: Int = -4


scala> def m(f:(Int,Int)=>Int) = f(2,6)
m: (f: (Int, Int) => Int)Int

scala> def f2(x:Int,y:Int)= x-y
f2: (x: Int, y: Int)Int

scala> m(f2)
res3: Int = -4

scala>

方法轉(zhuǎn)換成函數(shù)

把方法作為參數(shù)傳給一個方法或者函數(shù)的時候。方法被轉(zhuǎn)換為函數(shù)
使用神奇的下劃線 _

scala> def m1(x:Int,y:Int) = x+y
m1: (x: Int, y: Int)Int

scala> m1 _
res19: (Int, Int) => Int = <function2>

scala> m1(_,_)
res20: (Int, Int) => Int = <function2>

Function Type is (roughly) a type of the form (T1, ..., Tn) => U, which is a shorthand for the trait FunctionN in the standard library. Anonymous Functions and Method Values have function types, and function types can be used as part of value, variable and function declarations and definitions. In fact, it can be part of a method type.

Method Type is a non-value type. That means there is no value - no object, no instance - with a method type. As mentioned above, a Method Value actually has a Function Type. A method type is a def declaration - everything about a def except its body.

例子:

scala> def m1(x:Int) = x+3
m1: (x: Int)Int    

scala> val f1 = (x: Int) => x+3
f1: Int => Int = <function1>

看到?jīng)],方法定義和函數(shù)定義是不是在scala的解析器signature上就有顯示了,def m1(x: Int) = x+3就是一個簡單的method的定義。signature中m1: (x: Int)Int 表示method m1有一個參數(shù)Int型參數(shù)x,返回值是Int型。

val f1 = (x: Int) => x+3則是function的定義,解析器的signature中f1: Int => Int = <function1>表示function f1的method體接受一個Int型的參數(shù),輸出結(jié)果的類型是Int型。

從上面的例子,得出一個總結(jié):

方法是一個以def開頭的帶有參數(shù)列表(可以無參數(shù)列表)的一個邏輯操作塊,這正如object或者class中的成員方法一樣。

函數(shù)是一個賦值給一個變量(或者常量)的匿名方法(帶或者不帶參數(shù)列表),并且通過=>轉(zhuǎn)換符號跟上邏輯代碼塊的一個表達式。=>轉(zhuǎn)換符號后面的邏輯代碼塊的寫法與method的body部分相同。

“scala方法與函數(shù)的定義及使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI