我正在使用 DatePicker(一个小部件),并且我使用 .init() 与它 .init() 需要四件事。
open fun init( year: Int,
monthOfYear: Int,
dayOfMonth: Int,
onDateChangedListener: DatePicker.OnDateChangedListener! ): Unit
我可以这样编码
val datepicker = findViewById<DatePicker>(R.id.date_Picker)
val today =Calendar.getInstance()
datepicker.init(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
today.get(Calendar.DAY_OF_MONTH))
{view,year,month,day->
// things it do when the date is changed
}
为什么我可以这样写?只给出一个 lambda? “观”、“年”、“月”、“日”从何而来?这个 lambda 如何读取我选择的日期并将其传递给 lambda?
因为 Kotlin 语言在底层很聪明。 如果有一个只有一个函数的接口,您可以传入一个 lambda,并且在幕后它将生成一个从该接口派生的类,并在该单个函数中调用您的 lambda。
那么
datepicker.init(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
today.get(Calendar.DAY_OF_MONTH))
{view,year,month,day->
// things it do when the date is changed
}
变成:
class MyListener: DatePicker.OnDateChangedListener {
override fun onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//body of your lambda
}
}
datepicker.init(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
today.get(Calendar.DAY_OF_MONTH),
MyListener()
仅当类型是具有单个函数的接口时,这才有效。 如果有两个函数,它将不知道要覆盖哪一个,因此将无法编译。
lambda 的参数只是调用 lambda 时传入的普通值。 您可以随意称呼它们,但它们的类型和数量由您正在实现的接口决定。