kotlin 官方学习教程之语法

来源:互联网 发布:青果软件 刘萍 编辑:程序博客网 时间:2024/06/10 20:42

这是 kotlin 学习教程第二篇,为大家讲解 kotlin 的语法。因为本系列文章是作者翻译官方文档而来,所以有一些描述可能不太正确,建议大家都到官网运行一下实例,有助于理解。


语法

创建 DTO(POJO / POCO)

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

提供带有下列功能的 Customer 类:

  • 所有属性的getter (和 var 的 setter)

  • equals()

  • hashCode()

  • toString()

  • copy()

  • 所有属性的 component1(),component2(),…

函数参数的默认值

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

过滤列表

val positives = list.filter { x -> x > 0 }

或者,可以更简洁一些:

val positives = list.filter { it > 0 }

字符串插值

println("Name $name")

实例检验

when (x) {    is Foo -> ...    is Bar -> ...    else   -> ...}

遍历映射表/列表对

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

k,v 可以调用任意事件

使用范围

for (i in 1..100) { ... }  // 闭区间:包括 100for (i in 1 until 100) { ... } // 半开半闭区间: 不包括 100for (x in 2..10 step 2) { ... }for (x in 10 downTo 1) { ... }if (x in 1..10) { ... }

只读列表

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

只读映射表

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

访问映射表

println(map["key"])map["key"] = value

Lazy 属性

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

扩展函数

fun String.spaceToCamelCase() { ... }"Convert this to camelcase".spaceToCamelCase()

创建一个单例模式

object Resource {    val name = "Name"}

If 非空简写

val files = File("Test").listFiles()println(files?.size)

If 非空和 else 简写

val files = File("Test").listFiles()println(files?.size ?: "empty")

If 为 null,执行语句

val data = ...val email = data["email"] ?: throw IllegalStateException("Email is missing!")

If 不为 null,执行语句

val data = ...data?.let {    ... // 如果不为空,执行这一块代码}

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)    }    // 与 result 一起工作}

if 表达式

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

返回类型为 Unit 的方法生成器风格用法

fun arrayOfMinusOnes(size: Int): IntArray {    return IntArray(size).apply { fill(-1) }}

单一表达式函数

fun theAnswer() = 42

这相当于:

fun theAnswer(): Int {    return 42}

这可以与其它语法有效的组合在一起,简化代码。如:与 when 表达式:

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

在一个对象实例 (‘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()}

Java 7 中带有资源的 try

val stream = Files.newInputStream(Paths.get("/some/file.txt"))stream.buffered().reader().use { reader ->    println(reader.readText())}

需要通用类型信息的通用函数的方便形式

//  public final class Gson {//     ...//     public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {//     ...inline fun <reified T: Any> Gson.fromJson(json): T = this.fromJson(json, T::class.java)

使用可空的布尔值

val b: Boolean? = ...if (b == true) {    ...} else {    // `b` 为 false 或者 null}