kotlin学习笔记之基础

2019-04-20  本文已影响0人  大荒里种菜

函数

从最经典的例子开始:一个打印“Hello,world!”的程序。

fun main(args: Array<String>) {
    println("Hello,World!");
}

现在来分析下这段代码:

变量

声明变量的关键字有两个:

    val a: Int = 1      // 立即赋值
    val b = 2           // 类型推断,和js一样
    val c: Int          // 若只是声明而没有赋值,初始化类型不能省略

    var x = 5 // 自动推断出 `Int` 类型
    x += 1

    // 顶级变量,可以理解为全局变量,在js中也比较常见
    val PI = 3.14
    var x = 0

    fun incrementX() {
        x += 1
    }

字符串模板

    // 常见的
    val i = 10;
    println("i=$i")

    // 用花括号括起来的任意表达式
    val s = "abc"
    println("$s.length is ${s.length}")

    // 在原始字符串中表示字面值`$`字符,它不支持反斜杠转义
    val price = """
        ${'$'}9.99
    """

类型

在kotlin中,所有东西都是对象,在这个意义上讲可以在任何变量上调用成员函数与属性。其基本类型主要有数字、字符、布尔值、数组与字符串。

数字

注意:

字符

布尔

Boolean表示,有两个值:truefalse

数组

使用Array类来表示,其内部已经定义了getset函数以及属性size

    // 初始化一个数组
    var arr1 = arrayOf(1, 2, 3)
    println(arr1.get(0)) // 1
    println(arr1[0])     // 1

    // 初始化一个长度为10的Int类型的数组
    var arr2 = arrayOfNulls<Int>(10)

    // 初始化一个长度为5的数组,lambda的含义:asc[i] = (i * i).toString() ,i是索引
    var asc = Array(5, { i -> (i * i).toString() })
    asc.forEach { println(it) } // 0 1 4 9 16

字符串

字符串用String类型表示。

if表达式

在kotlin中,if是表达式,而不是语句,它有返回值,而java中的if是语句。

    // 作为表达式    
    // 若if作为表达式而不是语句,该表达式需要有else分支
    val max = if (a > b) a else b

    val max = if (a > b) {
        print("Choose a")
        a
    } else {
        print("Choose b")
        b
    }

when表达式

when取代了类C语言的switch操作符,与if相似。

    // 简单形式
    when (x) {
        1 -> print("x=1")
        2 -> {
            print("x=2")
        }
        else -> print("x既不是1也不是2")
    }

    // 可以合并分支
    when (x) {
        1, 2 -> print("x=1 or x=2")
        else -> print("x既不是1也不是2")
    }

    // 可以使用任意表达式作为分支条件
    when (x) {
        x == 1 -> print("x=1")
        x == 2 -> print("x=2")
        else -> print("x既不是1也不是2")
    }
    
    when (x) {
        in 1..10 -> print("x在这个区间")
        !in 10..20 -> print("x不在这个区间")
        else -> print("x都不在这些区间")
    }

    // 检测这个值是或者不是一个特定的类型的值
    fun hasPrefix(x: Any) = when(x) {
        is String -> x.startsWith("prefix")
        else -> false
    }

    // 不带参数,和if-else if链一样的功能
    when {
        x.isOdd() -> print("x is odd")
        x.isEven() -> print("x is even")
        else -> print("x is funny")
    }

while循环

kotlin中的while循环和do-while循环和Java中相应的循环没有什么区别。

for循环

for循环会配合in运算符来一起使用,很灵活。

    // 在数字区间上迭代
    for (i in 1..3) {
        println(i)
    }

    for (i in 6 downTo 0 step 2) {
        println(i)
    }

    // 通过索引遍历一个数组或者一个list
    for (i in array.indices) {
        println(array[i])
    }

    for ((index, value) in array.withIndex()) {
        println("the element at $index is $value")
    }

区间

使用..运算符来表示,如1..10,但它是闭区间的,常常结合in!in运算符来检查一个值是否在区间中,可以达到迭代数据的目的。

    // 顺序遍历
    for (i in 1..4) print(i)

    // 逆序遍历
    for (i in 4 downTo 1) print(i)

    // 以不等于1的任意步长迭代数字
    for (i in 1..4 step 2) print(i)

    for (i in 4 downTo 1 step 2) print(i)
    
    // 不包含结束元素
    for (i in 1 until 10) {
        // i in [1, 10) 排除了 10
        println(i)
    }

异常

kotlin的异常处理和Java以及其他许多语言处理方式相似。一个函数可以正常结束,也可以在出现错误的情况下抛出异常。方法的调用者能捕获到这个异常并处理它;如果没有被处理,异常会沿着调用栈再次抛出。

kotlin的异常更多的时候是作为表达式来使用。另外,kotlin没有受检异常。

    // 传统用法
    throw Exception("Hi There!")

    try {
        // 一些代码
    } catch (e: SomeException) {
        // 处理程序
    } finally {
        // 可选的 finally 块
    }

    // throw表达式
    val number = 20
    val per =
            if (number in 0..100)
                number
            else
                throw IllegalArgumentException(
                        "A per value must be between 0 and 100:$number"
                )

    // try作为表达式
    val a: Int? = try {
        parseInt(input)
    } catch (e: NumberFormatException) {
        null
    }

可空性

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

    fun parseInt(str: String): Int? {

    }

    fun myPrintln(str: String?) {

    }
上一篇 下一篇

猜你喜欢

热点阅读