Kotlin高阶用法
lambda表达式
-
基本语法
-
返回值
lambda 表达式 总是返回函数体内部最后一行表达式的值 -
作用域
在java函数中内部定义一个匿名类或者lambda,内部类访问的函数局部变量必须是final的,内部类是无法修改函数局部变量的值。Kotlin的内部类或者lamda中,不仅可以访问final 的变量,也可以访问非final的变量,也就是说在lamda内部可以直接修改函数局部变量的值。
-
实战
//android lamda表达式
class MainActivity : AppCompatActivity() {
private val button: Button by lazy { findViewById(R.id.button_center) }
@SuppressLint("ShowToast")
private fun multiply(a: Int, b: (c: Int, d: Int) -> Int, e: Int) = a + b.invoke(1, 2) + e
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
if (savedInstanceState == null) {
supportFragmentManager.beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commitNow()
}
button.setOnClickListener {
it.visibility = View.GONE
Toast.makeText(this,"you have clicked it !",Toast.LENGTH_LONG)
}
val add = { a: Int, b: Int -> a + b }
val x = add(1, 2)
val addOp = fun Int.(other: Int) : Int = this + other
print(1.addOp(2))
multiply(10, { a: Int, b: Int -> a + b }, 20)
var sum: Int = 0
var arr = arrayListOf<Int>(1, 2, 3)
arr.filter {
it < 7
}.forEach {
sum += it
}
arr.apply {
this.add(1)
this.add(this@MainActivity.multiply(1, { a: Int, b: Int -> a - b }, 2))
}
val dataList : MutableList<String> = mutableListOf("ok")
TestAdapter(this, dataList).setOnClickListener {
position, context -> Toast.makeText(this,"you have clicked $position is $context !",Toast.LENGTH_LONG)
}
}
}
class TestAdapter(val context: Context, var dataList: MutableList<String>): RecyclerView.Adapter<TestAdapter.ViewHolder>() {
private var mListener: ( (Int, String) -> Unit ) ? = null
fun setOnClickListener(mListener: (pos : Int, item : String) -> Unit) {
this.mListener = mListener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestAdapter.ViewHolder {
TODO("Not yet implemented")
}
override fun onBindViewHolder(holder: TestAdapter.ViewHolder, position: Int) {
TODO("Not yet implemented")
holder.itemView.setOnClickListener {
mListener?.invoke(position, dataList[position])
}
}
override fun getItemCount(): Int {
TODO("Not yet implemented")
}
class ViewHolder(item: View):RecyclerView.ViewHolder(item)
}