KotlinKotlin编程Kotlin

Kotlin知识点总结与初写时的一些建议

2018-04-08  本文已影响73人  竹尘居士

本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新...

对象相关

属性字段相关

编译时常量

延迟初始化属性

复写属性

代理(委托)模式

密封类

接口

扩展

数据类

我们经常创建一个只保存数据的类。在这样的类中一些函数只是机械的对它们持有的数据进行,如从服务端返回的Json字符串对象映射成Java类。data类使用:

data class 类名(var param1 :数据类型,...){}
data class 类名 可见性修饰符 constructor(var param1 : 数据类型 = 默认值,...)
//data为声明数据类的关键字,必须书写在class关键字之前。
//在没有结构体的时候,大括号{}可省略。
//构造函数中必须存在至少一个参数,并且必须使用val或var修饰。这一点在下面数据类特性中会详细讲解。
//参数的默认值可有可无。(若要实例一个无参数的数据类,则就要用到默认值)
// 定义一个名为Person的数据类:
data class Preson(var name : String,val sex : Int, var age : Int)

data类必须满足的条件:

约定俗成的规定:当构造函数中的参过多时,为了代码的阅读性,一个参数的定义占据一行。

编辑器为我们做的事情:

copy函数的使用:

data class User(val name : String, val pwd : String)

val mUser = User("kotlin","123456")
println(mUser)
val mNewUser = mUser.copy(name = "new Kotlin")
println(mNewUser)

标准库提供的data类: Pair 和 Triple,源码如下:

@file:kotlin.jvm.JvmName("TuplesKt")
package kotlin

// 这里去掉了源码中的注释
public data class Pair<out A, out B>(
        public val first: A,
        public val second: B) : Serializable {
    
    // toString()方法
    public override fun toString(): String = "($first, $second)"
}

// 转换
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

// 转换成List集合
public fun <T> Pair<T, T>.toList(): List<T> = listOf(first, second)

// 这里去掉了源码中的注释
public data class Triple<out A, out B, out C>(
        public val first: A,
        public val second: B,
        public val third: C ) : Serializable {

    // toString()方法
    public override fun toString(): String = "($first, $second, $third)"
}

// 转换成List集合
public fun <T> Triple<T, T, T>.toList(): List<T> = listOf(first, second, third)

泛型

嵌套类

函数

协程

。。。

空安全

等式

多重申明(解构申明)

var (name, age) = person

所以在使用Map.Entry.getkey时使用调用到component1(),getvalue时调用component2():

var personA: Person = Person("Door", 22, "ShanDong")
 var personB: Person = Person("Green", 30, "BeiJing")
 var personC: Person = Person("Dark", 23, "YunNan")
 var personD: Person = Person("Tool", 26, "GuanDong")
 var personE: Person = Person("Mark", 24, "TianJin")

 var map = HashMap<String, Person>()
 map.put("1", personA)
 map.put("2", personB)
 map.put("3", personC)
 map.put("4", personD)
 map.put("5", personE)
 for ((key, value) in map) {
     println("key: $key, value: $value")
 }
// Log打印
key: 1, value: Person(name='Door', age=22, addr='ShanDong', mobile=null)
key: 2, value: Person(name='Green', age=30, addr='BeiJing', mobile=null)
key: 3, value: Person(name='Dark', age=23, addr='YunNan', mobile=null)
key: 4, value: Person(name='Tool', age=26, addr='GuanDong', mobile=null)
key: 5, value: Person(name='Mark', age=24, addr='TianJin', mobile=null)

Ranges

类型检查和转换

This表达式

运算符号重载

。。。

operator fun get(position: Int) = dailyForecast[position]

//xxx[position]

一些使用时的笔记(建议)

作者:竹尘居士

博客:http://zhuchen.vip/2018/04/01/kotlin/kotlin-learn-summary.html

上一篇下一篇

猜你喜欢

热点阅读