前言

本文汇总kotlin里常用API、基础知识,会持续更新,便于查阅。

kotlin中文站

equals()和hashCode()方法

  1. Kotlin 中的== 等同于调用 equals() 函数,比较两个对象引用是否相等要用 === 操作符。
  2. ==操作符时不需要担心空安全,a == b 等同于 a?.equals(b) ?: b == null
  3. 和Java一样,复写equals()方法同样遵循复写equals()方法遵守的约定,需要同时复写hashCode()方法。
public open class Any public constructor() {public open operator fun equals(other: kotlin.Any?): kotlin.Boolean { /* compiled code */ }public open fun hashCode(): kotlin.Int { /* compiled code */ }public open fun toString(): kotlin.String { /* compiled code */ }
}

lateinit、lazy、getter()

private lateinit var mViewMoudule: ViewModuleImpl;
private val mLiveData by lazy { MutableLiveData<Bean>() }
val textView: TextViewget() = findViewById(R.id.tv_sth)
  • lateinit 关键字
    变量在定义时不需要初始化,所以在使用变量时,不需要加上 ? 和 !! 操作符。
    但是在使用第一次变量之前,一定要保证为它赋值 , 不然会出现空指针异常。

  • by lazy
    在第一次使用该变量时会进行赋值;
    十分适合加载可能访问或不可访问的变量。

  • get() 函数
    每次调用该变量时,即相当于调用get()函数,适合Bean属性的获取,不适合复杂赋值等变量

扩展函数、全局函数、内联函数

  • 扩展函数

    1. Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。 这通过叫做 扩展 的特殊声明完成。 这种机制称为 扩展函数 。此外,也有 扩展属性 ,
    2. 扩展不能真正的修改他们所扩展的类。通过定义一个扩展,你并没有在一个类中插入新成员, 仅仅是可以通过该类型的变量用点表达式去调用这个新函数。
    3. 扩展函数是静态分发的,即他们不是接收者类型的虚方法。 这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的, 而不是由表达式运行时求值结果决定的。即静态绑定的,非动态运行时类型推断的,无虚表替换。
    4. 如果一个类定义有一个成员函数与一个扩展函数,而这两个函数又有相同的接收者类型、 相同的名字,并且都适用给定的参数,这种情况总是取成员函数。
  • 全局函数

    1. 全局函数的作用域是以包为作用域的;
    2. 引入的时候可以直接使用import xxx.全局函数,这个跟java的不同;
    3. 也就是同一个包作用域下,不可以有“同名”的全局函数;
    4. 如果不同的包作用域下,有“同名”的全局函数,则需要引入全局函数的全局路径即可;
  • 内联函数

    1. 添加inline关键字使函数成为内联函数,inline 修饰符影响函数本身和传给它的 lambda 表达式,所有这些都将内联到调用处;
    2. 内联可能导致生成的代码增加,好好使用这个功能;
    3. 可以添加noinline修饰符标记不希望内联的函数参数;
    4. inline在kotlin这里是真的内联的,但是在cpp里是建议编译器进行优化,注意一下这块。

例如如下例子:

// 对MutableList<T>进行扩展,添加swap函数。
fun <T> MutableList<T>.swap(index1: Int, index2: Int) {val tmp = this[index1] // “this”对应该列表this[index1] = this[index2]this[index2] = tmp
}// 封装lock inline函数
inline fun <T> lock(lock: Lock, block: () -> T): T { lock.lock()try {block()} finally {lock.unlock()}
}

作用域函数:let、apply、also、run、with

在使用这些内联函数,要特别注意返回值,避免使用错误。有些很相近,而内部的代码块中接收者是 this 或 it。
可能有点类似语义上的区别了,之后在使用的过程中再熟悉总结吧,最常用还是let和apply了。

函数 对象引用 返回值 是否是扩展函数
let it Lambda 表达式结果
run this Lambda 表达式结果
with this Lambda 表达式结果 不是,把上下文对象当做参数
apply this 上下文对象
also it 上下文对象
  • let
    let常用的场景就是使用let函数判空处理,在let闭包下不用写繁琐的问号了。
var list: List<Int>? = null
list?.let {// 不空位的情况
} ?: let {// 为空的情况
}var list: List<Int>? = mutableListOf()
val let = list?.let {it.size   // 最后一行返回值
}public inline fun <T, R> T.let(block: (T) -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return block(this)  // 返回闭包
}
  • apply
    apply一般用于对象实例初始化的时候,使用apply初始化对象的各种属性,或者直接调用对象方法进行初始化。
var map = HashMap<String, String>().apply {put("key", "value")
}
var view = TextView(this).apply { id = R.id.textView }public inline fun <T> T.apply(block: T.() -> Unit): T {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}block()return this  // 返回对象本身
}
  • run、with、also

    • with可以用于UI数据绑定实体,返回闭包最后一行数据,但是user为null时实用性不如let;
    • run返回闭包结果,传入的是this,主要目的是强调需要执行的函数
    • also返回调用对象本身,also 就像 apply :它接受接收者、做⼀些动作、并返回该接收者。 ⼆者区别是在apply 内部的代码块中接收者是 this,⽽在 also 内部的代码块中是 it。
var user: User? = null;
var result = with(user, {tv_name.text = this?.name"${this?.name}, ${this?.age}" // 返回闭包最后一行
})// 从intent取key_extra的值,不为非空且内容不为空,赋值给url。否则弹出提示并关闭页面。
var url = intent.getStringExtra("key_extra")?.takeIf { it.isNotEmpty() } ?: run {Log.e("mLogU", "null url")finish()
}

class

  • data class User(val name: String, val age: Int)

    1. Kotlin 使用 data class 创建一个只包含数据的类,这种类又称数据类
    2. Kotlin 中的数据类是只包含属性布不包含方法的特殊类
    3. 编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:
      equals()/hashCode()
      toString()格式如"User(name=John, age=42)"
      componentN() functions对应于属性,按声明顺序排列
      copy()函数
  • sealed class 是一种同时拥有枚举类 enum 和 普通类 class 特性的类,叫做密封类。
    使用普通的类不能把限制关系表达出来,使用枚举类则无法灵活地自定义需要的类的内容。这时候,sealed class 就派上用场了。比如在处理结果 Result 的时候:

sealed class Result {data class Success(val code: Int) : Result()data class Exception(val code: Int, val message: String) : Result()
}

Kotlin 常用API汇总相关推荐

  1. c、c++ 常用API汇总

    前言 本文汇总c.cpp里常用API,会持续更新,便于查阅. C语言部分参考:C语言 基础知识整理 <string.h> 传入此类函数的指针必须是以空字符为结尾的. char *strch ...

  2. python-kafka 常用 api 汇总

    简介 python连接kafka的标准库,kafka-python和pykafka.kafka-python使用的人多是比较成熟的库,kafka-python并没有zk的支持.pykafka是Sams ...

  3. 工作、生活免费常用API汇总

    free-api: https://www.free-api.com/ 短信验证码:可用于登录.注册.找回密码.支付认证等等应用场景.支持三大运营商,3秒可达,99.99%到达率,支持大容量高并发. ...

  4. jquery的常用API汇总

    1.$.contains()方法 定义与用法:$.contains() 方法用于判断指定元素内是否包含另一个元素.即判断另一个DOM元素是否是指定DOM元素的后代.语法: $.contains( co ...

  5. C#:字符串的常用API汇总

    目录 一:字符串声明 二:字符串的使用 1,转义字符 ' / ' 2,"@"符号 3,字符串分割 4,截取字符串 5,替换字符串 6,将字符串转大写和小写 7,移除当前字符串的前后 ...

  6. JavaScript一些常用 API整理汇总

    JavaScript一些常用 API整理汇总 Array new Set() 数组去重 const arr = [3,4,4,5,4,6,5,7]; console.log(new Set(arr)) ...

  7. 【大数据分析必备】超全国内常用API接口汇总

    下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送.音乐.云.语义识别 ...

  8. C++常用功能汇总-文件读写 计时 随机数

    C++常用功能汇总-文件读写 计时 随机数 1.字符串string类 2.文件读写 (1)文本文件读取与写入 (2)文件夹相关操作 3.计时函数 time() clock() timeGetTime( ...

  9. 大数据技术之_17_Storm学习_Storm 概述+Storm 基础知识+Storm 集群搭建+Storm 常用 API+Storm 分组策略和并发度

    大数据技术之_17_Storm学习 一 Storm 概述 1.1 离线计算是什么? 1.2 流式计算是什么? 1.3 Storm 是什么? 1.4 Storm 与 Hadoop 的区别 1.5 Sto ...

  10. Java常用命令汇总(笔记)

    Java常用命令汇总 文章目录 Java常用命令汇总 1.javac 将文件编译成.class文件 2.java 执行 .class文件,若类中没有main函数,则不能执行. 3.jar 主要用于打包 ...

最新文章

  1. 整理Simple.Data使用方法
  2. mysql update 加减乘除运算
  3. Vue之vue-cli安装与简单调试
  4. optee的RPC设计(模型)详解
  5. printf以及可变参数函数讲解(转载)
  6. NOKIA自己掌控的新的智能手机系统ASHA
  7. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(2)
  8. hdu1247(Hat’s Words)
  9. 老兄,还在为你的MarkDown写作发愁吗?这些数学符号表达式绝对有你想要的那个,最后还有字体和颜色的修改方法哦
  10. iPhone 12搭载5nm A14芯片:晶体管数量高达150亿
  11. Spring事务管理(二)分布式事务管理之JTA与链式事务
  12. java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决办法
  13. cvSlite 和cvMerge 实现图像的通道分离和混合的说明
  14. 什么是波特率,波特率怎么计算
  15. 使用stm32配置自定义的HID设备
  16. 【狂神说】——Spring笔记(全)
  17. pandas:世界各国GDP数据集数据清洗案例
  18. Python:RuntimeWarning: invalid value encountered in true_divide解决方案
  19. windows10下面安装alphapose解决 ImportError : cannot import name ‘deform_conv_cuda‘
  20. 手机RSS资源地,各大网站RSS源地址订阅

热门文章

  1. asp.net中实现登陆的时候用SSL
  2. [项目总结-原创]InternetRadio项目Ajax技术方案选型
  3. bug人生--状态在编程中的使用
  4. 苹果手机充电口接触不良怎么办_用了HOU吼猴3C数码配件让手机充电口不再接触不良...
  5. 江苏计算机专业接本,江苏农牧科技职业学院专接本或专转本的通知
  6. 对口本科计算机专业,对口高考计算机类专业综合试题(卷).doc
  7. [Python图像处理] .获取图像属性、兴趣ROI区域及通道处理
  8. grpcio安装不了
  9. 开发笔记1 关于指针,结构体使用指针的问题
  10. 浅谈InnoDB存储引擎的MVCC机制