美文网首页
kotlin学习笔记之基础

kotlin学习笔记之基础

作者: 大荒里种菜 | 来源:发表于2019-04-20 10:08 被阅读0次

函数

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

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

现在来分析下这段代码:

  • 使用关键字fun来声明一个函数
  • args是参数名字
  • 参数的类型写在参数名的后面,即Array<String>
  • 函数返回值类型定义位置紧跟小括号后面,如fun test(): Int {},若没有返回值可以不写
  • 函数可以定义在文件最外层,就是说可以定义在类之外,java的函数需要定义在类的里面,像js就可以定义在文件的最外层
  • 数组就是类,和Java不同,kotlin没有声明数组类型的特殊语法
  • 使用println代替了System.out.println
  • 可以省略每行代码结尾的分号,与js一样
  • 文件若放在默认包里面,第一行不会使用关键字package标识,若在自定义的包里,包名会声明在源文件的顶部,倘若需要使用到其他包的函数或类等,可以使用import关键字,这些语法与Java一样

变量

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

  • val,不可变引用。使用val声明的变量不能在初始化之后再次赋值。它对应Java的final变量
  • var,可变引用。这种变量的值可以被改变。这种声明对应的是普通(非final)的Java变量
    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中,所有东西都是对象,在这个意义上讲可以在任何变量上调用成员函数与属性。其基本类型主要有数字、字符、布尔值、数组与字符串。

数字

  • Double-64bit
  • Float-32bit
  • Long-64bit
  • Int-32bit
  • Short-16bit
  • Byte-8bit

注意:

  • 在kotlin中字符不是数字
  • Long类型使用大写L标记
  • 浮点数默认是Double型,Float使用f或F标记
  • 可以使用“_”增强可读性,如val oneMillion = 1_000_000
  • 较小的类型不能隐式转换为较大的类型

字符

  • 使用Char类型表示
  • 不能直接当作数字
  • 用单引号''括起来
  • 特殊字符使用反斜杠转义

布尔

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类型表示。

  • 字符串是不可变的
  • 可以使用[]来访问,如s[i]
  • 可以使用for循环迭代
  • 可以使用+操作符连接字符串
  • 原始字符串,使用三个引号""" """将内容括起来,内部没有转义并且可以包含换行以及任何其他字符

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?) {

    }

相关文章

网友评论

      本文标题:kotlin学习笔记之基础

      本文链接:https://www.haomeiwen.com/subject/jivzwqtx.html