Scala 函數(shù)式編程

2022-05-13 15:02 更新

Scala允許我們將函數(shù)表達為文字。

函數(shù)文字允許我們有一個函數(shù)類型的表達式,我們可以寫一個短格式,而不聲明它的名稱。

函數(shù)類型可以是以下之一:

  • 可以為其分配函數(shù)的變量或參數(shù)的類型
  • 采用函數(shù)參數(shù)的高階函數(shù)的參數(shù)
  • 返回函數(shù)的高階函數(shù)的結果類型

函數(shù)常量以括號括起來的逗號分隔的參數(shù)列表開頭,后跟箭頭和函數(shù)體。

函數(shù)常量也稱為匿名函數(shù)。

考慮一個add函數(shù):

val add = (x: Int, y: Int) => x + y

使用函數(shù)常量,您可以定義添加函數(shù),如下所示:

(x: Int, y: Int) => x + y.

函數(shù)常量被實例化為稱為函數(shù)值的對象。

函數(shù)對象擴展FunctionN traits中的一個,例如Function0,F(xiàn)unction1等等直到Function22。

根據(jù)函數(shù)中的參數(shù)數(shù)量,相應的FunctionN trait由編譯器選擇。

對于具有兩個參數(shù)的函數(shù),編譯器選擇Function2作為底層類型。對于具有3個參數(shù)的函數(shù),編譯器選擇Function3,對于具有4個參數(shù)的函數(shù),F(xiàn)unction4等。

因為函數(shù)值是一個對象,它可以存儲在一個變量中,它可以使用括號函數(shù)調用來調用,如下所示:

object Main extends App {
   val add = (a: Int, b: Int) => a + b
   println(add(1, 2));
}

一級函數(shù)和高階函數(shù)

Scala函數(shù)是對象。

在函數(shù)式編程中,函數(shù)是一等公民函數(shù)。 一等公民函數(shù)可以

  • 分配給變量,
  • 作為參數(shù)傳遞給另一個函數(shù)
  • 作為其他函數(shù)的值返回。

將函數(shù)作為參數(shù)或返回函數(shù)的函數(shù)稱為高階函數(shù)。

函數(shù)作為變量

正如我們可以傳遞String,Int和其他變量一樣,我們可以像一個變量一樣傳遞一個函數(shù)。

我們可以定義一個函數(shù)常量,然后將該常量賦值給一個變量。

以下代碼定義了一個函數(shù)常量,它接受一個I??nt參數(shù),并返回一個值,該值是傳遞的Int的兩倍:

(i: Int) => { i * 2 }

我們現(xiàn)在可以將該函數(shù)常量分配給一個變量:

val doubler = (i: Int) => { i * 2 }

變量doubler是一個函數(shù)的實例,稱為函數(shù)值。

我們現(xiàn)在可以調用doubler,如下所示:

doubler(2)

doubler 是Function1 trait的一個實例,它定義了一個接受一個參數(shù)的函數(shù)。

doubler 是使用關鍵字 val 創(chuàng)建并分配給變量的函數(shù)。

函數(shù)作為參數(shù)

我們可以創(chuàng)建一個函數(shù)或一個方法,它將一個函數(shù)作為參數(shù)。

為此,首先定義一個將函數(shù)作為參數(shù)的方法。

    def operation(functionparam:(Int, Int) => Int) {
        println(functionparam(4,4))
    }

操作方法使用一個名為functionparam的參數(shù),它是一個函數(shù)。

functionparam函數(shù)接受兩個Int并返回一個 Int 。

操作方法返回一個Unit,指示操作方法不返回任何內容。

接下來,定義一個與預期簽名匹配的函數(shù)。以下add函數(shù)匹配該簽名,因為它需要兩個Int參數(shù)并返回Int:

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

現(xiàn)在我們可以將一個add函數(shù)傳遞給操作方法:

object Main extends App {
    def operation(functionparam:(Int, Int) => Int) {
        println(functionparam(4,4))
    }
    val add = (x: Int, y:Int) => { x + y }
    operation(add)
}

任何匹配此簽名的函數(shù)都可以傳遞到操作方法中。

object Main extends App {
    def operation(functionparam:(Int, Int) => Int) {
        println(functionparam(4,4))
    }
    val add = (x: Int, y:Int) => { x + y }
    operation(add)
    val subtract = (x: Int, y:Int) => { x - y }
    val multiply = (x: Int, y:Int) => { x*y }

    operation(subtract)
    operation(multiply)
}

返回函數(shù)

我們可以從函數(shù)或方法返回一個函數(shù)。

為了做到這一點,首先定義一個匿名函數(shù)。下面的代碼聲明一個匿名函數(shù),它接受一個String參數(shù)并返回一個String:

(name: String) => { "hello" + " " + name }

現(xiàn)在我們將定義一個方法來返回我們剛才定義的匿名函數(shù)。

def greeting() = (name: String) => {"hello" + " " + name}

在=符號的左側有一個正常的方法聲明:

def greeting()

在右邊的是一個函數(shù)文字:

def greeting() = (name: String) => {"hello" + " " + name}

現(xiàn)在你可以將greeting()賦給一個變量:

val greet= greeting()

因為匿名函數(shù)接受一個String參數(shù)名,我們可以傳遞一個名字:

object Main extends App {
    def greeting() = (name: String) => {"hello" + " " + name}
    val greet= greeting()
    println(greet("Scala"))
}
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號