kotlinKotlinkotlin频道

Kotlin一些高阶函数的使用

2016-08-22  本文已影响7352人  747a945a4501

前言


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)
    ....
}
上一篇 下一篇

猜你喜欢

热点阅读