Kotlin学习之基本语法

前言

Kotlin是一种可以运行在Java虚拟机上的静态类型编程语言,由JetBrains公司(开发IDEA的那个)设计开发并开源。

程序入口点

复制fun main(args: Array<String>) {
    println("Hello world")
}

类似java的main()方法,不过不需要放在类中,println()方法底层就是java的System.out.println(message)

函数定义

复制fun sum(a: Int, b: Int): Int {
    return a + b
}

有返回值

复制fun myPrint(a: Int): Unit {
    print(a)
}

无返回值,Unit类似java的void,可以省略。

复制fun sum2(a: Int, b: Int): Int = a + b

函数体为表达式

变量定义

复制fun main(args: Array<String>) {
    var num1: Int = 12  
    var num2 = 12           // 类型自动推导
    val num3 = 13
}

var定义可变变量,val定义不可变变量,类似java中的final,kotlin中都是对象,没有基本类型

模板字符串

复制fun main(args: Array<String>) {
    var age = 23
    var name = "lisi"
    var user = "$age,$name"
    println(user)//23,lisi
    user = "$age,${name.toUpperCase()}"
    println(user)//23,LISI
}

转义字符串

复制fun main(args: Array<String>) {
    var age = 23
    var str = """
        hello world
        age=$age
    """.trimIndent()
    println(str)
}

也可以叫做多行字符串,其中的换行符等会自动转义,其中也支持模板。

null值检查

复制fun main(args: Array<String>) {
    // var str:String = null // 不允许一个null值赋值给一个非null的类型
    var str: String? = null // 允许,表示该值可能为null
    println(str?.toInt())   //  如果str为null,不做处理直接返回null
    println(str?.toInt() ?: 23) // 如果str为null,取默认值23
    println(str!!) // 如果str为null,抛出空指针异常
}

正常我们声明的变量都是不能为null的,使用[类型]?格式声明可能为null的值,IntInt?不是同一种类型

类型自动转换

复制fun main(args: Array<String>) {
    println(len("hello")) //5
    println(len(arrayOf(1, 2, 3))) //3
    println(len(listOf("a", "b")))//2
    println(len(mapOf(Pair("a", "b"))))//1
    println(len(12))//null
}

fun len(obj: Any): Int? {  // Any类似java的Object,表示所有类型的父类
    if (obj is String) {   // is 类似java的instanceof
        // 此时obj已经自动转换成了String类型
        return obj.length
    }
    if (obj is Array<*>) { //数组类型
        return obj.size
    }
    if (obj is Collection<*>) { //集合类型
        return obj.size
    }
    if (obj is Map<*, *>) {  //Map类型
        return obj.size
    }
    return null
}

区间

复制fun main(args: Array<String>) {
    var range = 1..10 step 2         //表示从1到10,步长为2,等同于 1.rangeTo(10).step(2)
    var range2 = 9 downTo 1 step 2   //表示从9到1,步长为2,等同于 9.downTo(1).step(2)
    for (i in range) {  //13579
        print(i)
    }
    println()
    for (i in range2) {  //97531
        print(i)
    }
}

实际类型为IntProgression,包含起始位置,结束位置,步长。注意,此区间为左闭右闭,和java中不一样。

数组

复制fun main(args: Array<String>) {
    //intArrayOf()方法参数为可变参数类型
    val nums = intArrayOf(1, 2, 3) //arrayOf()支持所有类型
    //获取指定索引值
    println(nums[0])
    println(nums.get(0))
    //设置指定索引值
    nums[0] = 10
    nums.set(0, 10)
    //使用工厂函数创建数组
    val nums2 = IntArray(5, { i -> i * i }) //[0, 1, 4, 9, 16]
    println(nums2.asList())
}

kotlin数组功能更加强大

When表达式

复制fun main(args: Array<String>) {
    val score = 70
    when (score) {
        100 -> println("满分")
        in 90..99 -> println("优")
        else -> println("不及格")
    }
}

类似java中的switch,功能更加强大

For循环

复制fun main(args: Array<String>) {
    //遍历数组
    val nums = intArrayOf(1, 2, 3)
    for (num in nums) {
        println(num)
    }
    //遍历集合
    val names = listOf("李四", "张三")
    for (name in names) {
        println(name)
    }
    //遍历集合,包含索引和值
    for (withIndex in names.withIndex()) {
        println("${withIndex.index}:${withIndex.value}")
    }
}

类似java中的增强for循环,可以遍历任何提供了迭代器的对象

集合

复制fun main(args: Array<String>) {
    //不可变集合
    val languages = listOf("java", "javascript", "python")
    //集合处理
    languages.filter { it.length == 2 }
        .map { it.toUpperCase() }
        .sorted()
        .forEach { println(it) }
    println(languages.toList() == languages)     //true
    println(languages.toList().equals(languages))//true
    println(languages.toList() === languages) //false
    //可变集合
    val languages2 = mutableListOf("java", "javascript", "python")
    languages2.add("golang")
}

注意,集合调用filter()等方法处理之后返回的是一个新的集合,这点和java中Stream处理有区别。
kotlin中==的效果和equals()效果一致,比较两个对象的内容。
===的效果为比较两个引用是否指向同一个对象,类似java中的==
kotlin中严格区分可变集合(List)与不可变集合(MutableList)。

注释嵌套

复制/*
/*

 */
 */

java中不支持

使用kotlinc命令编译kotlin代码

复制kotlinc TestKotlinFirst.kt 
kotlinc TestKotlinFirst.kt -d TestKotlinFirst.jar
kotlinc TestKotlinFirst.kt -include-runtime -d TestKotlinFirst.jar
  • -d: 用来设置编译输出的名称,可以是 class 或 .jar 文件,也可以是目录。
  • -include-runtime : 让 .jar 文件包含 Kotlin 运行库,从而可以直接运行。

关于包名

类的包名可以和物理包名不一致

复制package com.imooc.kotlin_first 

com.imooc.kotlin_first.TestKotlinFirst.kt

导入其他类

复制import com.imooc.kotlin_first.Utility.multiply
import com.imooc.kotlin_first.Utility.multiply as mul

参考

Kotlin 教程
学习 Kotlin

posted @   strongmore  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示