本文都是kotlin 代码,含有kotlin高阶函数
class androidClick<T>{
// 元素类型是lambda 表达式。每个元素都是事件(T?) ->Unit
private val actions = arrayListOf<(T ?) ->Unit>()
private val values = arrayListOf<T ?>() //每个元素 都是事件需要的数据 元素类型是泛型?
fun addlisteners( value:T?,action:(T ?) ->Unit){
actions += action
values += value
}
//模拟点击事件,点击onclickListeners,先判断actions有没有事件,再执行actions里的所有元素
fun onclickListeners(){
if (actions.isEmpty()){
"没有事件"
return
}
actions.filterIndexed { index:Int, action:(T ?) ->Unit ->
action.invoke(values[index])//执行所有元素 == lambda ==用户自定义事件
true
}
}
}
//action:(T ?) ->Unit
fun <T> show1(value: T?) :Unit{
println("show1 这是个点击事件 $value")
}
这里是使用,使用我写了4种方式。
fun main() {
val func = androidClick<String>()
func.onclickListeners()
func.addlisteners("点击事件1"){
println("这是个点击事件 $it")
}
// 动态
func.addlisteners("点击事件2",::show1)
// val result:(T ?) ->Unit =::show1 类型错误
val result:(Any ?) ->Unit =::show1 //变化类型any
func.addlisteners("点击事件3",result)
val r2:(Any ?) ->Unit ={
println("r2 这是个点击事件 $it")
}
func.addlisteners("点击事件4",r2)
func.onclickListeners()
}