[Kotlin 小撇步 #1] Functional Interface (SAM)

Andy Lu
Apr 2, 2021

--

Photo by Pete Willis on Unsplash

你曾經使用 interface 作為 callback 嗎?

在 Java 中,我們會這樣子使用 Callback

  • 定義一個 interface
  • 在某一個Class 中,將這個 interface 當作參數傳入

這邊我們可以發現,當呼叫 Class1method時,我們需要把 Callback 當作參數傳進 method 中。

我們會在呼叫端實作 Callback ,並把它傳入 method 中。

這邊在 method 的參數欄中,直接 new 一個 Callback,並且實作它的方法。

如果是用 Java 8 以上,那麼實作 Callback 這段可以改成用 Lambda 表達式。

在 Kotlin 是怎麼實現 Callback 呢?

  • 同樣的,我們定義一個 interface
  • 一樣在 Class1method 中傳入這個 interface
  • 如何使用呢?

method 中,使用 object 建立匿名的 Callback 實例,並且實作裡面的方法( invoke )。

與 Java 直接在參數上 new Callback 的方式雷同。

Java 8 可以改為使用 Lambda 表達式,Kotlin 能夠做到嗎?

Functional Interface (SAM)

  • Functional Interface 的意思是功能性介面,我認為就是可以當作 function 的介面。
  • SAM Single Abstract Method ,單一抽象方法。

綜合以上,當 interface 裡面只有一個方法時,可以改成 Functional Interface

如何使用呢?

  • 只要在關鍵字 interface 前方加上 fun 即可。
  • 在方法中,同樣可以當作參數傳入
  • 呼叫端,只需要使用 { } 就可以直接實作這個方法
  • 如果參數只有一個,或是 functional interface 是位於參數最後方。括弧可以省略。

注意事項

  • 介面裡面只有一個方法時,才能夠使用 Functional Interface

如果你覺得本篇文章不錯,請拍手👏鼓勵我~

參考

Functional (SAM) interfaces: https://kotlinlang.org/docs/fun-interfaces.html

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet