共计 1496 个字符,预计需要花费 4 分钟才能阅读完成。
B 站视频:https://www.bilibili.com/vide…
语法层面
-
可空对象(和 C# 的
<Nullable>enabled</Nullable>
类似)Int
和Int?
是两种不同的类型;String
和String?
也是两种不同的类型(前者是后者的子类型)var a: Int = 0; var b: Int? = 0; a = b; // ⇐ 不能将 Int? 赋值给 Int b = a;
-
不可变类型 / 可变类型
val
申明不可变变量,不可再赋值;var
申明可变变量,能再赋值。var a = 0; val b = 1; a = b; b = a; // ⇐ 不能对 val 变量赋值
-
字符串插值
val PI = 3.1415926 val s1 = "PI is ${PI}"; // PI is 3.1415926 val s2 = "PI is ${String.format("%.2f", PI)}"; // PI is 3.14
字符串插值语法不反对设置格局(这点不如 C# 不便)
-
对函数式编程的反对,一切都是表达式
没有条件(三目)运算符,因为
if
分支就能做到(只是写起来字多一点)fun fixInt(value: Int?): Int { val n = value ?: 0; return if (n >= 0) n else -n; // C# 的 int? 能够参加运算,这点不同 }
when
甚至try ... catch
都能够作为表达式fun devide(m: Int, n: Int) { return try {m / n} catch (e: ArithmeticException) {0} }
-
函数式编程反对:
with
、also
、let
、run
、apply
下面的
fixInt
能够用let
来改写,留神是?.let
示意let
块里的it
是不含空的类型fun fixInt(value: Int?): Int {return value?.let { if (it >= 0) it else -it } ?: 0 }
with(obj)
块中会把this
援用到obj
对象下来,而this.
在不抵触的状况下是能够省略的with ("Hello World") {println("`${this}` has ${length} characters") } // `Hello World` has 11 characters
let
、also
、run
、apply
都是通过点号 (.
) 调用,前两个引入it
(或自定义变量),后两个引入this
;also
和apply
返回调用者,其余的返回最初一行的计算结果。 - 属性(去 getter/setter)
-
扩大办法
fun String.blabla() { ...}
感觉比 C# 的更正当,然而不能作为动态函数调用(尽管实质就是动态函数)
- 无差别的 Lambda(想想
Consumer
,Runable
等,雷同签名但不同接口的 Lambda 不能调换) -
对象解构
operator fun componentN()
操作符办法,用于解构。N
从 1 开始,按程序递增。 -
when 分支(Java 12 有 switch 表达式)
when (view) {is TextView -> toast(view.text) is RecyclerView -> toast("Item count = ${view.adapter.itemCount}") is SearchView -> toast("Current query: ${view.query}") else -> toast("View type not supported") }
工具(案例演示)
- 返转一个数组
int[]
- 字符串工具函数,比方
padStart
,orEmpty
等 - 相似 stream,但更简洁,
forEachIndexed
- 疾速创立 List 和 Map
- 把一大断
byte[]
转成十六进制并按每行 16 个字节的格局输入(文本)
其余
- 协程和
await
正文完