前语

最近没有什么好写的,正好对kt做一个总结。能够来简略聊聊运用kt时的一些tips,假如有大佬有其它更好的主张,希望能共享出来,废话不多说,直接开始。

1. 转成java进行预览

经过AS的Tools-> Kotlin -> Show Kotlin Bytecode 然后会显示一个机器语言的预览窗口,再点击Decompile就能显示java的预览作用。

Kotlin开发的100个Tips (一)

2. 字符串模板

Java中咱们做字符串拼接要用 + 号,比方一些打印带变量,例如写成Log.v(“mmp”,”code is ” + code)

在kotlin中有 $ 符号来表明字符串模板,仍是挺便当的。

上面的代码能够写成 Log.v(“mmp”,”code is ${code}”)

3. get/set办法

kotlin中的get/set办法会直接写在变量下边。

private var data : String ?= null
    set(value) {
        // todo
        field = value
    }
    get() {
        // todo
        return field
    }

记得刚开始从java转kotlin的时分还觉得这种写法挺古怪的,感觉有点不舒畅。可是当代码量大的时分,它的get/set办法和变量绑成一块,找指定的代码的时分仍是挺便当的。

4. data类

data类是kotlin中的数据类,在创立kt文件的时分能够直接挑选

Kotlin开发的100个Tips (一)

data class TestData(
    var name : String ?= "",
    var age : Int ?= 0,
    var sex : Int ?= 0,
)

运用时调用

val testData = TestData(age = 18)

有设置默认值的情况下能直接传指定参数,看得出运用起来十分简略,一般项目开发中的数据类都是运用data,就不会像java相同写一个类然后再写get/set办法来作为数据类了。kotlin供给这个data类对开发来说是能供给很大的便当。

5. ? 和 !! 判空

平常java中开发都是需求再许多地方进行判空的,一个稍不注意,就会出现空指针。我刚结业的时分便是有的时分在运用目标时分忘掉判空,当时还没kt,正巧某些极点的情况下测试也没测出来,你想想,在线上出现空指针的过错是一件多么丢人的事。

比方A目标中有B子目标,B目标中又有C子目标,然后一向有DEFG子目标。这没啥古怪的,当事务复杂时,数据结构就会嵌套多个目标,假如这时分用java来写判空的代码

if(a != null && a.b != null && a.b.c != null && ...... && a.b.c.d.e.f.g != null){
}

这样代码是没问题,但多少的确会让人觉得不舒畅。而在kt中?和!!能够完成判空的作用,假如不为空的话就持续执行,比方上面的代码能够改成

a?.b?.c?.d?.e?.f?.g?.let{
}

相关于java而言,首要写法更简略了,而且不容易漏判,由于假如或许为空的情况,你不用?符号,编译器就会提醒你,比方

Kotlin开发的100个Tips (一)

能够看到编译器会提醒你,这关于我这种写代码比较快的人来说,简直便是福音。

而!!关于?不同在于!!假如为空的话会抛出异常。具体情况具体运用。

6. 扩展函数

我这儿先啰嗦几句,其实kotlin里边的这些操作,仅仅一些思想。最终的完成也是会转成java去完成。能够简略了解成根据某些开发思想对本来的Java代码进行了封装。

扩展函数能够简略的了解成在原有的类的基础上去给这个类追加办法,而且这种操作不会对本来的类进行修正。那一听就很符合开闭原则的思想了。

假如我给上面的数据类TestData追加判断是否是男生的办法(一般不会直接对数据类做扩展,我这儿是为了演示)

fun TestData.isBoy() : Boolean{
    return sex == 1
}

这段代码在哪里写都得,不一定要在TestData里边写,调用的时分

val testData : TestData? = TestData(age = 18)
if (testData?.isBoy() == true){
    ......
}

能够看到扩展函数的运用很便当。可是也要注意,不要乱写,由于它是在哪里界说都行,所以最好是办理起来,这种代码不要到处乱飞,我一般假如对某个类加扩展函数,会给这个类独自写一个扩展文件进行办理。

还有,有些操作,你是需求对本来文件进行修正的,不是说一个文件你写好之后,之后都不会对这个文件进行修正,之后一切的修正都经过扩展函数去做,并不是这样的。

然后这儿能够提出一个问题扩展一下,扩展函数内部java代码是怎么完成的?

7. 伴生目标

在kotlin里边没有静态一说法,取而代之的是伴生目标

经过要害代码块

companion object{
}

假如咱们要界说类办法,就需求把办法界说在companion object里边。它表面上的作用便是和java中的静态的作用相同。但你不能说伴生目标便是静态,伴生是另一个概念,在Scala中也有伴生目标的概念,准确的说是Kotlin运用伴生目标来完成Java静态的作用,但不能说伴生便是静态

Kotlin开发的100个Tips (一)

8. object类

说了伴生,那就涉及到kotlin中object这个要害词,咱们假如要完成单例的作用,能够运用kotlin的object类

object类和data类相同能够直接创立出来

Kotlin开发的100个Tips (一)

object TestObject {
    fun test(){
    }
}

调用的时分直接调用

TestObject.test()

看起来像java调用类办法,其实它是单例,也便是相似于java中的TestObject.getInstance().test() 这种写法

能够看出kt中完成单例也比Java便当许多。

9. 高阶函数 let、with、apply、run、also

这几个便是kotlin中比较重要也实用得比较多的操作符了,假如用得顺手,将会大大增加你的开发效率。这几个是学kt一定要会的,官方已经有很具体的介绍了,这儿就只简略讲讲。

(1)let

先看看let表达式的界说: inline fun <T, R> T.let(block: (T) -> R): R

看不到没关系,只需求知道他是某个变量能调用let办法,在let代码块中能拿到这个变量,并最终返回最终一行

val result = testData?.let {
    it.age
}
Log.d("mmp", "测试成果 $result")

能够看到成果

Kotlin开发的100个Tips (一)

其他的高阶函数也是相似,我后边就不一一演示成果了。

这儿仅仅介绍这些操作符,而如何运用娴熟,这个就得靠积累了,我也不敢说我就已经能很娴熟运用这些操作符。什么场合运用哪个操作符能达到最大的收益,最合适,这个就需求各位自己去思考了。

(2) run

run有两个用法,inline fun run(block: () -> R): R 和 inline fun <T, R> T.run(block: T.() -> R): R

val result = run {
    "result"
}
testData?.run { 
    this.sex
}

(3) also

inline fun T.also(block: (T) -> Unit): T

这儿能够看出目标调用also办法,返回值是它自己,比方

val result = testData.also {
    it?.sex
}
Log.d("mmp", "测试成果 ${result}")

能够看到成果

Kotlin开发的100个Tips (一)

(4) apply

inline fun T.apply(block: T.() -> Unit): T

apply或许有人看不懂这个表达式,这儿能够解释一下,它的意思是它的内部作用域便是调用 apply的参数,例如

testData?.apply {
    sex = 1
    name = "xxxxx"
}

能够看到我这儿运用的时分不需求it.sex这样。当然run那也是这样,能够看到它编译器中会有提示this

Kotlin开发的100个Tips (一)

(5)with

inline fun <T, R> with(receiver: T, block: T.() -> R): R

能够这样运用

val result = with(testData!!){
    sex = 1
    name = "ABC"
    name
}

和上面的相似,这儿就不过多介绍了。由于这些操作符光讲是没办法让人娴熟的,需求自己去运用,用多了就娴熟了,假如娴熟的运用,对开发来说大有好处。可是又不得不讲,由于这是kt中必须要会的东西。

10. 高阶函数和Lambda表达式

高阶函数和Lambda表达式也是比较重要的东西,而且也是没办法片言只语讲清楚的,必须经常运用,才能娴熟的运用而且拥有自己的感悟。但其实高阶函数也是把双刃剑,假如你极致的去运用,导致你的代码能快速的去完成一些嵌套,可是他人不一定能一眼看得懂你写得啥玩意,但你又不能不用,由于他能为开发带来很大的便当。

这儿就举几个简略的例子说说,主要是为了证明好用。

比方Lambda表达式,咱们用Java写setOnClickListener,就不如用kt写的舒畅

tv.setOnClickListener {
    
}

在kotlin中,函数还能作为参数进行传递。比方我想写一个回调,在java中,我需求界说一个接口,然后在外层传递一个匿名类进来,而在kt中,简略的回调就无需去写接口,写接口却是不麻烦,可是相信许多人在命名的时分会纠结一段时间

private fun test(callback: () -> Unit) {
    callback.invoke()
}
// 在外层调用
test{
}

能够看到这样写就十分的便当,无需界说接口,这便是kt中高阶函数和Lambda表达式的魅力。当然我这儿的操作也仅仅简略的介绍,假如你能娴熟运用,你会发现在实际开发中用上高阶函数的地方并不少。

总结

这次先讲10个Tips,渐渐总结,总能凑够100个,假如有大佬也有一些好的做法和操作,也希望不吝赐教。