Kotlin学习之起始篇—习惯用法


收集了一些常见的Kotlin用法


1. 创建数据类

data class Customer(val name: String, val email: String){

}

通常我们会创建一些只用来保存数据的类,比如获取服务器传来的JSON数据后,将它转换保存为一个对应的数据实体。这样的数据实体类在Kotlin中可称为data类,并用data关键字来标注它,如上。

data类的构造函数可以直接写在类名后面,这个构造函数称为主构造函数。在主构造函数中声明属性时,必须在前面添加varval关键字。编译器会自动根据主构造函数中声明的属性添加toStringcopyequals等方法。

psdata类中可以有次构造函数,属性也可以和Java一样在类里面声明,但是这些属性会被toStringcopyequals等方法忽略。这里先不用深究,只要知道有data类就行。


2. 给函数的参数添加默认值

fun foo(a: Int = 0, b: String = "") { ... }

给参数添加默认值后,调用这个函数时,可以选择性地传参,或者不传。如下:

foo()           //不传参
foo(b = "123")  //只传其中一个参数
foo(a = 2)


3. 过滤列表

比如现在有一个整数列表myList,我希望把该列表中所有正整数拿出来单独作为一个正整数列表positiveList,操作方法如下:

var myList = listOf(1, 2, -1, -2, 3, 5)
var positiveList = myList.filter { it > 0 }

positiveList打印出来,结果如下:

[1, 2, 3, 5]


4. 遍历map

for ((k, v) in map) {
    println("$k -> $v")
}

这里的kv并不是关键字,可以用任何名字代替。

一个小例子:

 var map = mutableMapOf<Int, String>()
 map[0] = "crx"
 map[1] = "haha"
 map[4] = "eee"
 for ((x, y) in map){
    println("key = $x, value = $y")
 }

打印出来的结果如下:

key = 0, value = crx
key = 1, value = haha
key = 4, value = eee


5. range常见操作

for (i in 1..100) { ... } // 闭区间,包含100
for (i in 1 until 100) { ... } // 半闭半开区间,不包含100
for (x in 2..10 step 2) { ... }// step 2 表示一次跳2步,x将取 246810
for (x in 10 downTo 1) { ... } //从 101
if (x in 1..10) { ... } // 从 110


6. 只读list和map

生成只读list

val list = listOf("a", "b", "c")

生成只读map

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

既然是只读,意味着初始化之后就不能再修改。

读取上面的map
map["a"] 的值就是 1


7. Lazy 属性

val name: String by lazy{
    //属性name需要用到时才初始化
    "crx"
}

在变量后面添加关键字by lazy为变量添加lazy特性。具有lazy特性的变量会在第一次被调用时初始化。注意:by lazy关键字只能用来修饰只读变量。
举一个andorid初始化控件的例子

class MainActivity : AppCompatActivity() {
    private val messageView : TextView by lazy {
        findViewById(R.id.message_view) as TextView
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    fun onSayHello() {
        // Initialization would be run at here!!
        messageView.text = "Hello"
    }
}

上面的messageView在方法onSayHello被调用时才初始化,类似于懒加载。


8. 扩展方法

fun String.spaceToCamelCase(){
    var camelTest = this.split(" ")
        .map { it.replaceFirst(it[0], it[0].toUpperCase()) }
        .joinToString("")
    println(camelTest)
}

上面的方法用来将一个句子转换为驼峰字符串并打印出来。这种写法相当于为String类扩展了一个方法spaceToCamelCase,可以这样调用:

//直接调用
"space to camel case".spaceToCamelCase()
//或者
var sentence = "space to camel case"
sentence.spaceToCamelCase()


9. 创建一个单例

object MySingleton{
    fun printSomething(str: String){
        println(str)
    }
}

上面就是一个单例类MySingleton,用object关键字来修饰就行,这种单例相当于单例中的饿汉模式,至于单例的其它写法,这里暂时不深入,毕竟这里还是kotlin学习的起始篇(其实是因为我还不知道怎么写)。上面的单例类调用方式如下:

MySingleton.printSomething("test print")


10. 获取可空集合的第一个item

val emails = ... // might be empty
val mainEmail = emails.firstOrNull() ?: ""

没什么特别的,就是调用集合的firstOrNull方法,如果不为空,则取第一个item的值,如果为空,则取值""


11. 如果不为空则执行

val value = ...
value?.let {
    ... // 如果value不为空,执行括号中的代码块
}

这里有一个let关键字,具体作用暂不讲。


12. 有返回值的 when / try-catch / if 表达式

when表达式

fun transform(color: String): Int {
    return when (color) {
        "Red" -> 0
        "Green" -> 1
        "Blue" -> 2
        else -> throw IllegalArgumentException("Invalid color param value")
    }
}

try-catch表达式

fun test() {
    val result = try {
        count()
    } catch (e: ArithmeticException) {
        throw IllegalStateException(e)
    }
    // Working with result
}

if 表达式

fun foo(param: Int) {
    val result = if (param == 1) {
        "one"
    } else if (param == 2) {
        "two"
    } else {
        "three"
    }
}

以上这些都是kotlin的惯用写法,记住就行了。


我是使用kotlin官方文档 来学习的,目前这篇来源于其中Getting Started章的第二节,我不是一味地翻译其中的内容,也有自己的理解。源篇中有些内容这里没有体现出来,一是因为有些内容和上一篇 Kotlin学习之起始篇—基础语法 重复了,还有些是因为内容较难理解,我认为不应该放进 起始篇,所以就去除了。如果想了解更多,不妨直接看官方文档。
刚接触kotlin不久,难免有理解错误的地方,请见谅。

猜你喜欢

转载自blog.csdn.net/chenrenxiang/article/details/80583595
今日推荐