Android kotlin 杂项

1 字符串可以包含模板表达式 , 模板表达式以美元符( $ )开头。

val i = 10
val s = "i = $i" // 求值结果为 "i = 10"

2 引用相等

引用相等由 ===(以及其否定形式 !== )操作判断。a === b 当且仅当 a 和 b 指向同一个对象时求值为 true。

3 结构相等

结构相等由 ==(以及其否定形式 != )操作判断;
按照惯例,像 a == b 这样的表达式会翻译成

a?.equals(b) ?: (b === null)

4 幕后字段,field

Kotlin 中类不能有字段。当使自定义定义访问器时,有时有个幕后字段(backing field)有时是必要的。为此 Kotlin 提供一个自动幕后字段,它可通过使用 field 标识符访问;

var counter = 0 // 此初始器值直接写⼊到幕后字段
set(value) {
    if (value >= 0)
        field = value
}

5 幕后属性

private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
    get() {
        if (_table == null) {
            _table = HashMap() // 类型参数已推断出
        }
        return _table ?: throw AssertionError("Set to null by another thread")
    }

6 惰性初始化属性,lateinit
如果在定义变量时(例如定义成员变量),又想该变量不为空,又不想子定义时就初始化

该修饰符只能在类体中(不是在主构造函数中)声明的 var 属性,并且仅当该属性没有定义 getter 或 setter 时。

该属性必须是非空类型,并且不能是原生类型。

public class MyTest {
    lateinit var subject: TestSubject
    @SetUp fun setup() {
        subject = TestSubject()
    }
    @Test fun test() {
        subject.method() // 直接解引⽤
    }
}

7 扩展是静态解析

扩展不能真正的修改他们所扩展的类。通过定义一个扩展,你并没有在这个类中插入新成员, 仅仅是可以通过该类型的变量点表达式去调用这个新函数;

如果定义有成员函数和扩展函数,这两个函数有相同的接收者类型、相同的名字并且都适给定的参数,这种情况总是取成员函数。

结果是C

open class C
class D: C()
    fun C.foo() = "c"
    fun D.foo() = "d"
    fun printFoo(c: C) {
    println(c.foo())
}
printFoo(D())

可空接收者扩展

可以为可空的接收者类型定义扩展。

fun Any?.toString(): String {
    if (this == null) return "null"
    // 空检测之后,“this”会⾃动转换为⾮空类型,所以下⾯的 toString()
    // 解析为 Any 类的成员函数
    return toString()
}

8 扩展属性的行为只能通过明确给定的取值方法与设值方法来定义。

val <T> List<T>.lastIndex: Int
    get() = size - 1

9 扩展声明为成员

class D {
    fun bar() { …… }
}
class C {
    fun baz() { …… }
    fun D.foo() {
        bar() // 调D.bar,其中的对象成员可以无需通过限定符访问
        baz() // 调C.baz
    }
}

扩展声明所在的类的实例称为分发接收者,

扩展方法调用所在的接收者类型的实例称为扩展接收者 。

对于分发接收者和扩展接收者的成员名字冲突的情况,扩展接收者优先。

限定的 this语法,可以区分函数

class C {
fun D.foo() {
    toString() // 调 D.toString()
    this@C.toString() // 调C.toString()
}

10 类型的检查与转换

is 和 !is 操作符

智能转换

fun demo(x: Any) {
if (x is String) {
    print(x.length) // x 自动转换为字符串
}
}

11 “不安全的”转换操作符---as
如果转换是不可能的,转换操作符会抛出异常

12 “安全的(” 可空)转换操作符--as?
转换失败返回null

13 解构声明

所谓的解构声明就是将一个对象解构(destructure)为多个变量,也就是意味着一个解构声明会一次性创建多个变量.简单的来说,一个解构声明有两个动作:

声明了多个变量

将对象的属性值赋值给相应的变量

可以从一个函数返回多个变量

数据类,
data class Person(var name: String, var age: Int) {
}
当我们对Person的实例使用解构声明时,可以这样做:

var person: Person = Person("Jone", 20)
var (name, age) = person

println("name: $name, age: $age")// 打印:name: Jone, age: 20

对于非数据类,需要自定义componentN
data class Person(var name: String, var age: Int, var addr: String) {
        var mobile: String ?= null

    operator fun component4(): String {
        return this.mobile!!
    }
}

14 延迟初始化

val p: String by lazy {
// 计算该字符串
}

15 对一个对象实例调用多个方法( with)

class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { // 画⼀个 100 像素的正⽅形
penDown()
for(i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容