一、无返回值的高阶
写法:
写法一:
fun login1(s: String, s1: String, function: (s: String, s1: String) -> Unit) {
function(s, s1)
}
写法二:将高阶进行抽离,使用关键字typealias
typealias Function = (s: String, s1: String) -> Unit
fun login2(s: String, s1: String, function: Function) {
function(s, s1)
}
调用:
login1(s, s1) { s, s1 ->
println("1111111 s=$s,s1=$s1")
}
login2(s, s1) { s, s1 ->
println("222222 s=$s,s1=$s1")
}
执行顺序
高阶函数:
fun show4(isLogin: Boolean, loginMethod: (String) -> Boolean) {
println("111111 isLogin=$isLogin")
val loginMethod1 = loginMethod("呵呵呵")
println("333333 $loginMethod1")
}
调用高阶函数:
show4(false) {
println("22222 $it")
true
}
二、有返回值的高阶
高阶函数:
fun testLogin(username: String, password: String, loginMethod: (Boolean) -> Boolean) {
if (username == "张三" && password == "123456") {
val loginMethod1 = loginMethod(true)
println("成功?${!loginMethod1}")
} else {
val loginMethod1 = loginMethod(false)
println("失败?${!loginMethod1}")
}
}
调用高阶函数:
testLogin("张三", "123456") {
!it
}
三、高阶进阶
讲解:
普通函数
fun myMethod() {
println("我是method方法")
}
高阶函数1:
fun <T, R> T.testMethod(funcation: () -> R): R {
return funcation()
}
高阶函数2:T.()相当于是给T来一个匿名函数
fun <T, R> T.testMethod2(funcation: T. () -> R): R {
return funcation()
}
调用
val a = myMethod().testMethod {
println("main......testMethod")
true
}
println("a=$a")
val b = myMethod().testMethod2 {
println("main......testMethod2")
"哈哈哈哈"
}
println("b=$b")
实例:获取字符串长度
val name2 = "hahah"
/**
* T.()相当于是给T来一个匿名函数
*/
fun <T, R> getLength(stringContent: T, lengthMethod: T.() -> R): R {
return stringContent.lengthMethod()
}
val stringlength = getLength(name2) {
length//这句相当于this.length(),this就是T
}
println("length111=$stringlength")
源码中的应用:run、let、apply
val context: Context? = null
//崩溃 kotlin.UninitializedPropertyAccessException: lateinit property context has not been initialized
val recyclerView: RecyclerView = RecyclerView(context!!)
//不崩溃,如果context为null,不执行
context?.run { RecyclerView(this) }
//不崩溃,如果context为null,不执行
context?.let { RecyclerView(it) }
举一反三:
true的时候才执行某段代码
fun checkTrue(isTrue: Boolean, mm: () -> Unit) {
if (isTrue) mm()
}
checkTrue(true) {
println("执行了吗.....111111")//执行
}
checkTrue(false) {
println("执行了吗.....2222222")//不执行
}
val myRun = Runnable {
println("执行了....Runnable thread=${Thread.currentThread().name}")
}
checkTrue(true, myRun::run)//执行,相当于调用了myRun的run方法
源码实现:
run
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
let
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
apply
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
网友评论