Kotlin 基础语法

作者: 元苍子 | 来源:发表于2018-02-06 15:26 被阅读0次

    本文参考官方文档:http://kotlinlang.org/docs/kotlin-docs.pdf
    本文参考博客:《灰蓝时光》

    定义包的规范应位于源文件的顶部

    package my.demo
    import java.awt.Rectangle
    import java.util.*
    

    Kotlin 中的注释

    // --- 单行注释---
    /* --- 多行注释 ---*/
    

    定义函数

    // 带有两个Int参数、返回Int的函数:
    fun sum(a:Int, b:Int):Int{
        return a + b  // 返回的是Int
    }
    
    // 主函数入口,程序执行:定义函数
    fun main(args:Array<String>){
        print("sum of 3 and 5 is ")  // print 打印不换行
        println(sum(3,5))  // println 打印换行
    }
    
    // 将表达式作为函数体、返回值类型自动推断的函数:
    fun sum(a:Int, b:Int) = a + b
    
    fun main(args:Array<String>){
        println("sum of 19 and 23 is ${sum(19, 23)}")  // ${} 占位
    }
    
    // 函数返回无意义的值
    fun print_sum(a:Int, b:Int): Unit{
        println("sum of $a and $b is ${a + b}")  // $ 占位
    }
    
    fun main (args: Array<String>){
        print_sum(-1, 8)
    }
    
     //  Unit 返回类型可以省略:
    fun printSum(a:Int, b:Int){
        println("sum of $a and $b is ${a + b}")
    }
    
    fun main(args: Array<String>){
        printSum(-1, 8)
    }
    

    定义变量

    // 一次赋值--只读--局部变量
    fun main(args: Array<String>){
        val a: Int = 1 // 立即赋值
        val b = 2  // 自动推断出 ‘Int’ 类型
        val c:Int  // 如果没有初始值类型不能省略
        c = 3
        println("a = $a, b = $b, c = $c")
    }
    
    // 可变变量
    fun main(args: Array<String>){
        var x = 5  // 自动推断出“Int”类型
        x += 1
        println("x = $x")
    }
    
    // 顶层变量:
    val PI = 3.14
    var x = 0
    fun incrementX(){
        x += 1
    }
    
    fun main(args: Array<String>){
        println("x = $x, PI = $PI")
        incrementX()
        println("incrementX()")
        println("x = $x, PI = $PI")
    }
    /*变量还可以作为属性和字段使用 */
    

    使用字符串模板

    fun main(args:Array<String>){
        var a = 1
        // 模板中的简单名称
        val s1 = "a is $a"
        a = 2
        // 模板中的任意表达式:
        val s2 = "${s1.replace("is", "was")}, but now is $a"
        println(s2)
    }
    

    使用条件表达式

    fun maxOf(a:Int, b:Int):Int{
        return if (a > b){
            a
        }else{
            b
        }
    }
    fun main(args:Array<String>){
        println("max of 0 and 42 is ${maxOf(0, 42)}")
    }
    
    // 使用if作为表达式:
    fun moxOf(a:Int, b:Int) = if (a > b) a else b
    fun main(args: Array<String>){
        println("maxOf of 0 and 42 is ${maxOf(0, 42)}")
    }
    

    使用可空值及null检测

    // 当变量的值可以为null的时候,必须在声明处的类型后添加? 用来标识该应用可为空。
    fun parseInt(str:String):Int?{
        // ......
    }
    
    // 使用返回可空值的函数
    fun parseInt(string: String):Int?{
        return string.toIntOrNull()
    
    fun printProduct(arg1:String, arg2:String){
        val x = parseInt(arg1)
        val y = parseInt(arg2)
        // 直接使用 x * y 会导致编译器错误,因为他们可能为null
        if (x == null) {
            println("Wrong number format in arg1:'$arg1'")
            return
        }
        if (y == null){
            println("Wrong number format in arg2: '$arg2'")
            return
        }
    }
        // 在空检测后,x 和 y自动转换为非空值(non-nullable)
        println(x * y)
    }
    
    fun main(args:Array<String>){
        printProduct("6", "7")
        printProduct("a", "7")
        printProduct("6", "b")
        printProduct("a", "b")
    }
    

    使用类型检测及自动类型转换

    /* is 运算符检测一个表达式是否某类型的一个实例。
    * 如果一个不可变的局部变量或属性已经判断出为某类型
    * 那么检测后的分支中可以直接当作该类型使用,无需显示转换*/
    fun getStringLength(obj: Any):Int?{
        if (obj is String) {
            // 'obj'在条件分支内自动转换成'String'
            return obj.length
        }
        // 在离开类型检测分支后,'obj'仍然是'Any'类型
        return null
    }
    fun main(args:Array<String>){
        fun printLength(obj: Any){
            println("'$obj' string length is ${getStringLength(obj) ?: " ... err, not a string"}")
        }
        printLength("Incomprehensibilities")
        printLength(1000)
        printLength(listOf(Any()))
    }
    

    使用for循环

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

    使用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++
        }
    }
    

    使用when表达式

    fun describe(obj:Any):String =
            when(obj){
                1          -> "One"
                "Hello"    -> "Greeting"
                is Long    -> "Long"
                !is String -> "Not a string"
                else       -> "Unknown"
            }
    
    fun main(args:Array<String>){
        println(describe(1))
        println(describe("Hello"))
        println(describe(1000L))
        println(describe(2))
        println(describe("other"))
    }
    

    使用区间range

    // 使用 in 运算符来检测某个数字是否在指定区间内:
    fun main(args:Array<String>){
        val x = 10
        val y = 9
        if (x in 1..y+1){
            println("fits in range")
        }
    }
    
    // 检测某个数字是否在指定区间外:
    fun main(args:Array<String>){
        val list = listOf("a", "b", "c")
        if (-1 !in 0..list.lastIndex){
            println("-1 is out of range")
        }
        if (list.size !in list.indices){
            println("list size is out of valid list indices range too")
        }
    }
    
    // 区间迭代
    fun main(args:Array<String>){
        for (x in 1..5){
            print(x)
        }
    }
    
    // 数列迭代
    fun main(args:Array<String>){
        for (x in 2..10 step 2){
            print(x)
        }
    }
    

    使用集合

    // 对集合进行迭代
    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")
        when{
            "orange" in items -> println("juicy")
            "apple" in items -> println("apple is fine too")
        }
    }
    
    // 使用lambda表达式来过滤(filter)和映射(map)集合:
    fun main(args:Array<String>){
        val fruits = listOf("banana", "avocado", "apple", "kiwi")
        fruits
            .filter { it.startsWith("a") }
            .sortedBy { it }
            .map { it.toUpperCase() }  // 字母全部转换成大写
            .forEach { println(it) }
    }
    

    创建基本类及其实例:

    // 抽象类
    abstract class Shape (private val sides : List <Double> ) {
        val perimeter : Double get() = sides.sum()
        abstract fun calculateArea():Double
    }
    interface RectangleProperties{
        val  isSquare:Boolean
    }
    
    // 创建矩形类
    class Rectangle(
            var height:Double,
            var length: Double
    ):Shape(listOf(height, length, height, length)), RectangleProperties{
        override val isSquare: Boolean
            get() = length == height
    
        override fun calculateArea(): Double = height * length
    }
    
    //  创建三角形类
    class Triangle(
            private var sideA:Double,
            private var sideB:Double,
            private var sideC:Double
            ):Shape(listOf(sideA, sideB, sideC)){
        override fun calculateArea(): Double {
            val s = perimeter / 2
            return  Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC))
        }
    }
    
    fun main(args:Array<String>){
        val rectangle = Rectangle(5.0,2.0)  // 不需要“new”关键字
        val triangle = Triangle(3.0,4.0,5.0)
    
        println("Area of rectangle is ${rectangle.calculateArea()}, its perimeter is ${rectangle.perimeter}")
        println("Area of triangle is ${triangle.calculateArea()}, its perimeter is ${triangle.perimeter}")
    }
    

    相关文章

      网友评论

        本文标题:Kotlin 基础语法

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