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>    
相关推荐
我命由我123453 小时前
Android Studio - 在 Android Studio 中直观查看 Git 代码的更改
android·java·开发语言·git·java-ee·android studio·android jetpack
hewence13 小时前
Kotlin协程启动方式详解
android·开发语言·kotlin
城东米粉儿3 小时前
Android EventHub的Epoll原理 笔记
android
城东米粉儿3 小时前
Android音频系统 笔记
android
半切西瓜4 小时前
Android Studio 创建应用自动指定SDK目录
android·ide·android studio
RdoZam4 小时前
Android-封装个好用、轻量和通用的原生Adapter基类
android·kotlin
二流小码农4 小时前
鸿蒙开发:独立开发者的烦恼之icon图标选择
android·ios·harmonyos
独自破碎E5 小时前
BISHI43 讨厌鬼进货
android·java·开发语言
右手吉他5 小时前
Hostapd系统源代码学习
android