rakuishi.com

Kotlin: 関数オブジェクトと Invoke でクリックイベントをシンプルに書く

Kotlin では関数をオブジェクトとして扱うことができます。そして、その関数オブジェクトを invoke() すれば、その関数を発火することができます:

fun main(args: Array<String>) {
  val onClick: ((String) -> Unit) = { text -> println(text) }
  onClick.invoke("Hello, world!")
}
=== Output ===
Hello, world!

Android での実用例として、RecyclerView にセットした Adapter の各 ViewHolder からイベントを受け取るような処理は、View.OnClickListener を参考に Interface を記述するのが普通ですが、以下のように書くこともできます:

class CustomAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
  var onItemClick: ((String) -> Unit)? = null
  // 省略
  override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    // 省略
    holder.onItemClick = { onItemClick?.invoke("Hello, world!") }
  }
}

/**
 * 利用例:
 * val adapter = CustomAdapter()
 * adapter.onItemClick = { text -> println(text) }
 */