標籤:

Kotlin雜談(一) - 高等函數(Curry + 閉包)

本來沒啥動力寫東西,畢竟知乎上的Kotliner不少,而且寫的東西都很不錯,但昨晚Google突然把Kotlin擢升為Android的正宮..之一,讓我有點動力寫一下Kotlin

先行提醒,我是新手,寫的東西不一定對,有錯別客氣,請用力指出

這次說的高等函數(Higher-Order Function)與Java 8也有的Lambda表達式有關,如果只是初學編程的新手看不懂,我是不會負責的(逃

首先來假設一個場景吧,假設用戶進行某種動作,而程式會按動作作出相應的運算,一般來說在Java可以用Interface+一大堆設計模式去達成這個 (動作) -> 運算 的效果,但是這樣做的後果是一大堆class或者method會跑出來,這樣會讓人很煩燥....

在Kotlin,我們可以有替代方法來代替這招,基本上來說有兩個常用方法

1. Extension 擴展方法

2. 高等函數 (Curry + 閉包)

我今次不會採用方法1,說的是方法2

高等函數在Kotlin就是method也能當成object傳遞,這是因為first class function(函數一等公民)的關係,而將參數分調用層次傳遞的技術,我們稱之為Curry

(我知道這段很多嘈點,請冷靜orz)

Talk is cheap. Show code.

在函數calculate中,它首先接收了兩個整數作為參數,並返回一個匿名函數A (閉包,嗯),這匿名函數要求的參數是一個"接收兩個整數並返回一個整數"的函數

這段有點難理解吧,我們可以反過來想,我想的是用戶不論是輸入+-*/也能在同一函數中處理,而不用擴展方法/建立新類,那我們需要的是一個能這樣做的函數

這個函數呢,我們會傳對應的兩個整數進去,但我們怎樣才能令到函數執行我們想要的動作呢?(這裡就是+-*/)我們可以把動作函數變成參數丟進去,然後讓兩個整數在後面自動變成動作函數的參數,就會得到我們想要的結果了

我這裡的寫法是分兩層: 函數calculate(整數1, 整數2) -> 匿名函數( 接受(整數, 整數), 返回整數 的函數op) -> 返回 op(整數1, 整數2)

你說我想先傳函數op可以嗎?可以,可是我這裡的例子函數operate是先取得兩個整數的,所以才會這樣寫,有需要你也可以反過來 (如calculate2所示)

這樣寫有啥好處?比起一些超級冗長的API/參數,這樣在代碼的行文組織上更具可讀性,而且可視需求隨意控制參數傳遞的時機,當然這是在適當使用的前提下,有事沒事都用一等函數傳來傳去,效能和可讀性都會嚴重下降

PS: 如果看不懂,可能是因為我寫得差,那就忘了這篇吧

PS2:破乎的代碼顯示真是....


推薦閱讀:

Android 開發者自述:為什麼我要改用 Kotlin?
Kotlin 互動式命令行工具:kotlinc
#Kotlin# 一年の使用報告 - 函數式思想
Kotlin 讓使用 Android API 變得輕鬆

TAG:Kotlin |