前言
Kotlin的stdlib提供一些高阶函数,咱们今天就来一起看看这些函数。传送门
函数
1.TODO
Always throws NotImplementedError stating that operation is not implemented.
代码运行到这回抛未实现的异常,提醒你这边还未做!
fun init(){
TODO("还没有实现!")
}
FATAL EXCEPTION: main
kotlin.NotImplementedError: An operation is not implemented: 还没有实现!
at com.xxx.xxx.ui.TestActivity.init(TestActivity.kt:56)
at com.xxx.xxx.ui.TestActivity.initialize(TestActivity.kt:52)
at com.xxx.xxx.view.KActivity.onCreate(KActivity.kt:47)
...
2. apply

使用方法如下
//使用apply
val textView = TextView(this@TestActivity).apply {
textSize = sp(10f).toFloat()
textColor = Color.BLUE
leftDrawable(R.drawable.icon_user,10)
....
}
//等同于下面代码
val textView1 = TextView(this@TestActivity)
textView1.textSize = sp(10f).toFloat()
textView1.textColor = Color.BLUE
textView1.leftDrawable(R.drawable.icon_user,10)
textView1....
//也等同于
val textView1 = TextView(this@TestActivity)
with( textView1 ) {
textSize = sp(10f).toFloat()
textColor = Color.BLUE
leftDrawable(R.drawable.icon_user,10)
....
}
使用其实都差不多,就是第一种的优雅度更高一点
3. lazy
fun <T> lazy(initializer: () -> T): Lazy<T>
fun <T> lazy( mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T>
fun <T> lazy(lock: Any?, initializer: () -> T): Lazy<T>
函数定义如上,可以看出这个方法就是得到延迟初始化对象,前面的参数线程同步有关,使用方法 如下:
//得到lazy对象
val init = lazy(LazyThreadSafetyMode.SYNCHRONIZED) { TextView(this).apply {
textSize = sp(10f).toFloat()
textColor = Color.BLUE}
}
//或者 不设置参数
val init = lazy { TextView(this).apply {
textSize = sp(10f).toFloat()
textColor = Color.BLUE}
}
//等同于
val init by lazy { TextView(this).apply {
textSize = sp(10f).toFloat()
textColor = Color.BLUE}
}
//使用这个lazy<TextView>对象
init.value.gravity = Gravity.CENTER
3. let

从他的函数定义上,可以看出 这是个转换功能,讲T -> R。有点类似于RxJava里面的map()的功能。实例代码如下:
//讲图片资源id 转换为 Drawable对象
val drawable: Drawable = R.drawable.icon_default_image.let { getDrawable(it) }
//当然上面的例子看不出let的优越性,有点多此一举的感觉
//当然我还没有想到普通的使用方法体现他的优越性。 估计在函数式编程方面会体现的明显一点
//这个函数是这样的场景 学生毕业后,通过一系列考试条件转化为各种职业,一开始写的时候职业可能只有几个,要具有可扩展性
fun <VALUE> mapValue( student:Student , block:( Student ) -> VALUE) : VALUE {
...
val value = student.let( block(it) )
...
return value
}
4. repeat

没什么好讲的,重复做某件事情,他的源码如下:
@kotlin.internal.InlineOnly
public inline fun repeat(times: Int, action: (Int) -> Unit) {
for (index in 0..times - 1) {
action(index)
}
}
//使用方法
repeat(10) { print("index:$it")}
5. run

运行一段代码块,可以是否有返回值
run { }
"xxx".run { toUpperCase() }
6. to

不解释
7. with

使用方法如下
val textView1 = TextView(this@TestActivity)
with( textView1 ) {
textSize = sp(10f).toFloat()
textColor = Color.BLUE
leftDrawable(R.drawable.icon_user,10)
....
}
网友评论
里面的 it 指的什么,貌似没有声明?谢谢
例如 val aaaView:View aaaView.action() action这个闭包 实际就是 aaaView里面的一个扩展的匿名函数 action = {
//this 就代表 aaaView
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btn.setOnClickListener {
loadAsync(R.layout.async) {
second.text = "I am second TextView"
}
}
}
fun loadAsync(@LayoutRes res: Int, action: View.() -> Unit) {
AsyncLayoutInflater(this).inflate(res, ll_parent)
{ view, resid, parent ->
with(parent) {
addView(view)
action()
}
}
}
在这段代码中的loadAsync方法中有个action参数,这个闭包 中 action: View.() -> Unit) 的View.() 是代表着什么意思?我不太清楚麻烦能否告诉一下..