kotlin - 常用的标准库函数

1,533 阅读2分钟

Kotlin提供了一个系统库,是Java库的增强,很多函数适配了Java的类型和方法,同时使用Kotlin的语法,常见的几个函数

apply

apply函数可看作一个配置函数,你可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda给apply函数执行,它会返回配置好的接受者

// 以前的使用
val runnable = Runnable{
  print("runing")
}
val thread = Thread(runnable)
thread.isDaemon = true
thread.start()

//使用apply
Thread(runnable).apply { isDaemon = true }.start()

可以看到,调用一个个函数类配置接收者时,变量名就省略掉了,这时因为在lambda表达式里,apply能让每个陪孩子函数都作用于接收者,这种行为有时又叫做相关作用域,因为lambda表达式里的所有函数调用都是针对接收者的,或者说时针对接收者的隐式调用

let

let函数能使某个变量作用于其lambda表达式里,让it关键字能引用它。let与apply比较,let会把接收者传给lambda,而apply什么都不传,匿名函数执行完,apply会返回当前接收者,而let会返回lambda的最后一行。

//不使用let
var fristE=listOf(3,4,5).first();
var result2= fristE+fristE

//使用let
var result=listOf(3,4,5).first().let { 
  it+it
}

run

光看作用域行为,run和apply差不多,但与apply不同,run函数不返回接收者,run返回的是lambda结果,也就是true或者false

val file = File("E:// i have a dream.txt")
val run = file.run {
  readText().contains("great")
}

run也能用来执行函数引用

fun main(){
    "the people r of china".run(::isLong)
}
fun isLong(str:String) = str.length>=10

with

with函数是run的变体,他们的功能行为时一样的,但是with的调用方式不同,调用with时需要值参作为第一个参数传入

val with = with("the people r of china") {
  length >= 10
}

also

also函数和let函数功能相似,和let一样,also也是把接受者作为值参传给lambda,但是有一点不同,also返回接收者对象,而let返回lambda结果,因为这个差异,also尤其适合针对同一原始对象,利用副作用做事,既然also返回的事接收者对象,你就可以基于原始接收者对象执行额外的链式调用

var fileContents:List<String>
File("E:// i have a dream.txt")
  .also { 
    println(it.name)
  }.also {
    fileContents = it.readLines()
  }
println(fileContents)

takeIf

需要判断lambda中提供的条件表达式,给出true或false结果,如果判断结果事true,从takelf函数返回接收者对象,如果是false,则返回null。如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takeif就非常有用,

val readText = File("E:// i have a dream.txt")
  .takeIf { it.canRead() && it.canWrite() }
  ?.readText()

takeUnless

只有判断你给定的条件结果是false时,takeUnless才会返回原始接收者对象

val readText = File("E:// i have a dream.txt")
  .takeUnless { it.isHidden }
  ?.readText()