1、对于具有多个参数的 lambda 表达式,可以使⽤ _ 字符替换不使⽤的参数的名称:
map.forEach { _, value -> println("$value!") }
2、:: 操作符来获取指向特定对象实例的⽅法或属性的成员引⽤。
3、onEach 是⼀个⼩、但对于集合和序列很有⽤的扩展函数,它允许对操作链中的集合/序列的每个元素
执⾏⼀些操作,可能带有副作⽤。
4、also 就像 apply :它接受接收者、做⼀些动作、并返回该接收者。 ⼆者区别是在 apply 内部的代码
块中接收者是 this, ⽽在 also 内部的代码块中是 it。
5、takeIf 就像单个值的 filter 。它检查接收者是否满⾜该谓词,并在满⾜时返回该接收者否则不满
⾜时返回 null 。
6、takeUnless 与 takeIf 相同,只是它采⽤了反向谓词。当它 不 满⾜谓词时返回接收者,否则返回
null 。
7、groupingBy()此 API 可以⽤于按照键对集合进⾏分组,并同时折叠每个组。
8、当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ? 来标识该引⽤可为空。
9、is 运算符检测⼀个表达式是否某类型的⼀个实例。
10、when 将它的参数与所有的分⽀条件顺序⽐较,直到某个分⽀满⾜条件。 when 既可以被当做表达式使
⽤也可以被当做语句使⽤。如果它被当做表达式, 符合条件的分⽀的值就是整个表达式的值,如果当做
语句使⽤, 则忽略个别分⽀的值。
11、使⽤ in 运算符来检测某个数字是否在指定区间内
12、If not null 缩写println(files?.size)
13、If not null and else 缩写println(files?.size ?: "empty")
14、将短分⽀放在与条件相同的⾏上,⽆需花括号
15、当对链式调⽤换⾏时,将 . 字符或者 ?. 操作符放在下⼀⾏,并带有单倍缩进
16、总是使⽤不可变集合接⼝(Collection , List , Set , Map )来声明⽆需改变的集合。
17、如果需要在条件语句中⽤到可空的 Boolean , 使⽤ if (value == true) 或 if (value ==
false) 检测。
18、使⽤作⽤域函数 apply/with/run/also/let
-是否在块中的多个对象上调⽤⽅法,或者将上下⽂对象的实例作为参数传递?如果是,那么使⽤以
it ⽽不是 this 形式访问上下⽂对象的函数之⼀ ( also 或 let )。如果在代码块中根本没有
⽤到接收者,那么使⽤ also 。
-调⽤的结果是什么?如果结果需是该上下⽂对象,那么使⽤ apply 或 also 。 如果需要从代码块中
返回⼀个值,那么使⽤ with 、let 或者 run
-上下⽂对象是否可空,或者是否作为调⽤链的结果求值⽽来的?如果是,那么使⽤ apply 、let 或
者 run 。 否则,使⽤ with 或者 also 。
19、如果构造函数有注解或可⻅性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前
⾯
20、如果类有⼀个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造
函数间接委托。委托到同⼀个类的另⼀个构造函数⽤ this 关键字即可。
21、初始化块中的代码实际上会成为主构造函数的⼀部分。委托给主构造函数会作为次构造函数的
第⼀条语句,因此所有初始化块中的代码都会在次构造函数体之前执⾏。即使该类没有主构造函数,这
种委托仍会隐式发⽣,并且仍会执⾏初始化块
22、如果⼀个⾮抽象类没有声明任何(主或次)构造函数,它会有⼀个⽣成的不带参数的主构造函数。构造函
数的可⻅性是 public。
23、在 Kotlin 中所有类都有⼀个共同的超类 Any,这对于没有超类型声明的类是默认超类。
24、如果类没有主构造函数,那么每个次构造函数必须使⽤ super 关键字初始化其基类型,或委托给另⼀
个构造函数做到这⼀点。 注意,在这种情况下,不同的次构造函数可以调⽤基类型的不同的构造函数。
25、如果函数没有标注 open,那么⼦类中不允许定义相同签名的函数, 不论加不加 override。将 open 修饰符添加到 final 类(即没有 open 的类)的成员上不起作⽤。标记为 override 的成员本⾝是开放的,也就是说,它可以在⼦类中覆盖。如果你想禁⽌再次覆盖,使⽤final 关键字。
25、设计⼀个基类时,应该避免在构造函数、属性初始化器以及 init 块中使⽤ open成员。
26、在⼀个内部类中访问外部类的超类,可以通过由外部类名限定的 super 关键字来实现:super@Outer
27、要检测⼀个 lateinit var 是否已经初始化过,请在该属性的引⽤上使⽤ .isInitialized
28、声明⼀个扩展函数,我们需要⽤⼀个 接收者类型 也就是被扩展的类型来作为他的前缀。如果⼀个类定义有⼀个成员函数与⼀个扩展函数,⽽这两个函数⼜有相同的接收者类型、相同的名字,都适⽤给定的参数,这种情况 总是取成员函数。
29、注意可以为可空的接收者类型定义扩展。这样的扩展可以在对象变量上调⽤, 即使其值为 null,并且可
以在函数体内检测 this == null,这能让你在没有检测 null 的时候调⽤ Kotlin 中的toString():检
测发⽣在扩展函数的内部。
30、类可以标记为 inner 以便能够访问外部类的成员。内部类会带有⼀个对外部类的对象的引⽤
网友评论