Kotlin高阶函数

一. Kotlin相比Java有哪些优点.

(1).kotlin优势

  • 代码简洁,开发效率更高 不用使用findViewById,支减少冗余代码,支持空安全,扩展函数,属性,高阶函数和lambda表达式,内联函数。

  • 内存消耗更少 由于空安全特性和内联函数优化,它能够生成更高效的字节码,从而减少内存的使用。kotlin协程提供了一种轻量级的并发处理方式,可以进一步降低内存的占用。

  • kotlin是未来Android开发主流的语言,一些Android的新特性,新组件都会优先支持kotlin版本。

(2).kotlin劣势 kotlin编译速度相对java较慢,因为她需要进行额外的类型检查(空安全),和代码转换(kotlin-java-java字节码,复杂,耗性能)

备注:Kotlin与Java在运行时性能方面基本相当,由于kotlin支持inline函数,lambda表达式,在某些情况下性能还要由于java.

二 .Kotlin内置的高阶函数run的原理是什么,与let函数有啥区别?

kotlin 复制代码
(1).inline :表示这是一个内联函数,将函数代码直接插入调用处,避免了调用普通方法时,栈帧的创建,销毁所带来的开销。
(2).<T,R> T.run :T代表要为T扩展出一个名为run的函数,R表示lambda表达式最后一行返回的类型。
(3).block:T.()->R:
block:表示lambda的名称
T.():表示输入参数是T本身,让lambda表达式持有了this表示(T)调用者本身
R:表示lambda最后一行返回的类型.
(T) :表示输入参数是T本身,让lambda表达式持有了it表示(T)调用者本身

public inline fun<T,R> T.let(block:(T)->R){
    return block(this)
}

public inline fun<T,R> T.run(block:T.()->R):R{
      return block()
}
//with不是泛型的扩展方法,而是全局方法
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    return receiver.block()
}

public inline fun <T> T.also(block: (T) -> Unit): T {
    block(this)
    return this
}
public inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}



fun main(){
   var  result1="778".run{  
         true
        length
    }
   println(result1)   //3
  var result2="778".let{
         999
         "$it" //778
  }
}

为啥所有的类型都可以使用run或者let,那是因为高阶函数let和run是对泛型进行扩展,意味着所有类型都等于泛型,所以任何地方都可以使用.run和let的区别在于lambda表达式一个持有this表示调用者本身,一个持有it表示调用者本身。

php 复制代码
public inline <T> T.apply(block:T.()->unit):T
public inline <T> T.also(block:(T)->unit):T
public int <T,R> with(receiver:T,block:T.()->R):R

三 .kotlin语言泛型的形变是什么?【 extends out || super in】

  • 不变:指的是此泛型既可以是消费者,可以是生产者,没有任何继承相关的概念.
csharp 复制代码
class Student<T> {}   
  • 协变 : 指的是此泛型只能是生产者 ,泛型类型只能是T或者T的子类,只能get数据,无法add数据.
csharp 复制代码
ArrayList<out T>            
  • 逆变:指的是此泛型只能是消费者,泛型类型只能是T类型,或者T的父类,只能add数据,无法get【如果get数据,数据类型只能是Object】
r 复制代码
ArrayList<in T>    
相关推荐
-SOLO-4 小时前
Android Event 日志完全指南
android
壮哥_icon5 小时前
【Android 系统开发】从掉帧卡顿到丝滑:高频硬件中断(IRQ)的 CPU 亲和性性能优化实战
android·性能优化
千里马学框架5 小时前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
我命由我123457 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
狂奔solar8 小时前
ARMA 模型:从白噪声到万能逼近器
android
渣渣灰飞9 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第二章:RBAC 权限系统设计
android·学习·mysql
qq_422828629 小时前
android 图形学之图层数据送显及合成图层(七)
android
MiyamuraMiyako10 小时前
Compose:从自动滚动到双锚点 LazyLayout
android·android jetpack
用户634214199350712 小时前
base_logger_core --- 跨平台 C++ 日志核心库
android
苦瓜花12 小时前
【Kotlin】初入门
android·开发语言·kotlin