美文网首页kotlinKotlinkotlin频道
Kotlin一些高阶函数的使用

Kotlin一些高阶函数的使用

作者: 747a945a4501 | 来源:发表于2016-08-22 09:10 被阅读7352次

前言


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

API 说明

使用方法如下

//使用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

API 说明

从他的函数定义上,可以看出 这是个转换功能,讲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)
    ....
}

相关文章

网友评论

  • 春生_7291:你好 十分幸运看到您的分享,repeat 里有个问题想问一下 repeat(10) { print("index:$it")}
    里面的 it 指的什么,貌似没有声明?谢谢
    747a945a4501:repeat()最后一个参数是个函数,(Int)->Unit it代表这是第几次
  • 活这么大就没饱过:把特性的语法糖拎出来了,不错,不过要系统学习还是看中译文的官方文档好
  • 李简书:谢谢,找了好久...
    747a945a4501:@est7 这个闭包是view内部的 代码块,说白了 可以在闭包中直接使用 这个view的实例
    例如 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.() 是代表着什么意思?我不太清楚麻烦能否告诉一下..

本文标题:Kotlin一些高阶函数的使用

本文链接:https://www.haomeiwen.com/subject/lxlwsttx.html