Android开发

Kotlin-入门(二)

2017-07-09  本文已影响20人  洛城夜雨

上一篇文章《Kotlin-入门》写了kotlin的介绍、HelloWorld、函数定义、变量声明、各种注释以及字符串模板,这篇文章继续学习Kotlin的一些基础语法。

使用条件表达式

fun main(args: Array<String>) {
    var a = 15
    var b = 57
    println("max of $a and $b is ${maxOf(a, b)}")
    println("max of $a and $b is ${maxOf2(a, b)}")
}

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

/**
 * 此函数返回单个表达式,可以使用单表达式函数来实现
 */
fun maxOf2(a: Int,b: Int) = if (a > b) a else b

执行结果:

max of 15 and 57 is 57
max of 15 and 57 is 57

Process finished with exit code 0

使用可空值及 null 检测

当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ? 来标识该引用可为空。

如果 str 的内容不是数字返回 null

fun parseInt(str: String): Int? = str.toIntOrNull()

使用返回可空值的函数:

判值为null时打印输入的数据不正确

fun main(args: Array<String>) {
    printProduct("2","3")
    printProduct("2a","3")
    printProduct("2","3a")
}

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)
    if (x == null) {
        println("Wrong number format in arg1: '${arg1}'")
        return
    }
    if (y == null) {
        println("Wrong number format in arg2: '${arg2}'")
        return
    }
    // 在空检测后,x 和 y 会自动转换为非空值
    println(x * y)
}

执行结果:

6
Wrong number format in arg1: '2a'
Wrong number format in arg2: '3a'

Process finished with exit code 0

当值不为null时打印输入的两个整数的乘积

fun main(args: Array<String>) {
    printProduct("2","3")
    printProduct("2a","3")
    printProduct("2","3a")
}
fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)
    // 直接使用 `x * y` 可能会报错,因为他们可能为 null
    if (x != null && y != null) {
        // 在空检测后,x 和 y 会自动转换为非空值(non-nullable)
        println(x * y)
    }
    else {
        println("either '$arg1' or '$arg2' is not a number")
    }
}

执行结果:

6
either '2a' or '3' is not a number
either '2' or '3a' is not a number

Process finished with exit code 0

使用类型检查和自动转换

使用is运算符检测一个表达式是否某类型的一个实例。如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:

fun getStringLength(obj: Any): Int? {
    if(obj is String){
        // obj 经过is运算符检测过后,在该条件分支内已自动转换成String类型
        return obj.length
    }
    // 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
    return null
}

fun printLength(obj: Any) {
    println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
}

fun main(args: Array<String>) {
    printLength("HelloWorld")
    printLength(5000)
    printLength(true)
}

运行结果如下:

'HelloWorld' string length is 10 
'500' string length is ... err, not a string 
'true' string length is ... err, not a string 

Process finished with exit code 0

当然还有如下写法:

fun getStringLength(obj: Any): Int? {
    if (obj !is String) return null

    // `obj` 在这一分支自动转换为 `String`
    return obj.length
}
fun getStringLength(obj: Any): Int? {
    // `obj` 在 `&&` 右边自动转换成 `String` 类型
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}

使用for循环

for循环在java很常用,下面我们来看一下kotlin中的for循环怎么用:

fun main(args: Array<String>) {
    val items = listOf("Hello","Kotlin","Hey")
    for (item in items){
        println(item)
    }
}

执行结果如下:

Hello
Kotlin
Hey

Process finished with exit code 0

当然for循环的写法不止上面这一种,下面给展示一下其他写法(运行结果不一一贴了,有兴趣的可以自己试一下):

fun main(args: Array<String>) {
    val items = listOf("Hello","Kotlin","Hey")
    // 通过indices属性获取集合所有有效下标的一个集合
    for (index in items.indices){
        println("item at $index is ${items[index]}")
    }
}
fun main(args: Array<String>) {
    val items = listOf("Hello","Kotlin","Hey")
    // 通过库函数withIndex进行遍历
    for ((index, value) in items.withIndex()) {
        println("the element at $index is $value")
    }
}

当然又有同学可能会想通过for循环打印1到100,怎么写呢?

kotlin有一个Range(值范围)的概念。值范围表达式使用 rangeTo 函数来构造, 这个函数的操作符形式是 ..。废话不多说,直接上代码:

fun main(args: Array<String>) {
    for(i in 1..100) println(i)
}

一行代码搞定,是不是很强大。好了,for循环暂时了解这么多。

使用 while 循环

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
    var index = 0
    while (index < items.size) {
        println("item at $index is ${items[index]}")
        index++
    }
}

可以看出while循环和java里的几乎是没有区别的。当然 do..while也是。

使用 when 表达式

when 取代了类 C 语言的 switch 操作符。其最简单的形式如下:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意这个块
        print("x is neither 1 nor 2")
    }
}

when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。 when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式, 符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。(像 if 一样,每一个分支可以是一个代码块,它的值 是块中最后的表达式的值。)

如果其他分支都不满足条件将会求值 else 分支。 如果 when 作为一个表达式使用,则必须有 else 分支, 除非编译器能够检测出所有的可能情况都已经覆盖了。

如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔:

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

我们可以用任意表达式(而不只是常量)作为分支条件:

fun main(args: Array<String>) {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe("other"))
}

fun describe(obj: Any): String =
        when (obj) {
            1 -> "One"
            "Hello" -> "Greeting"
            is Long -> "Long"
            !is String -> "Not a string"
            else -> "Unknown"
        }

执行结果如下:

One
Greeting
Long
Not a string
Unknown

Process finished with exit code 0

使用区间(range)

区间表达式由具有操作符形式 ..rangeTo 函数辅以 in!in 形成。 区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:

整型区间(IntRangeLongRangeCharRange)有一个额外的特性:它们可以迭代。 编译器负责将其转换为类似 Java 的基于索引的 for-循环而无额外开销。

使用 in 运算符来检测某个数字是否在指定区间内:

for (i in 1..4) print(i) // 输出“1234”

如果你想倒序迭代数字呢?也很简单。你可以使用标准库中定义的 downTo() 函数

for (i in 4 downTo 1) print(i) // 输出“4321”

能否以不等于 1 的任意步长迭代数字? 当然没问题, 可以使用step() 函数

for (i in 1..4 step 2) print(i) // 输出“13”

for (i in 4 downTo 1 step 2) print(i) // 输出“42”

要创建一个不包括其结束元素的区间,可以使用 until 函数

for (i in 1 until 10) println(i)// i in [1, 10) 排除了 10

使用集合

如何迭代集合呢?

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
    for (item in items) println(item)
}

使用 in 运算符来判断集合内是否包含某实例:

fun main(args: Array<String>) {
    val items = listOf("apple", "banana", "kiwi")
    if ("banana" in items)
        println("banana in the collection")
    else
        println("banana isn't in the collection")
}// 输出“banana is in the collection”

原文地址:https://zhouyang-cn.github.io/2017/05/31/kotlin-basic-syntax2/

**转载请注明原文地址,谢谢!。

上一篇 下一篇

猜你喜欢

热点阅读