Kotlin-Learning 基本语法

包名

允许包名和文件路径不一致

为什么kotlin允许包名和文件所在路径不一致?

定义方法

// 2 个 Int 参数,返回一个 Int
fun sum(a:Int, b:Int): Int{
    return a+b
}
复制代码
// 一行方法体可以直接简写,不写返回值,由系统推测
fun sum(a:Int, b:Int) = a + b
复制代码
// 返回没有意义的值,返回值默认为 Unit
fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
复制代码
// Unit 可以省略
fun printSum(a: Int, b: Int){
    println("sum of $a and $b is ${a + b}")
}
复制代码

定义变量

    // 定义只读变量
    fun assignLocalVariable(){
        val a:Int = 1
        val b = 2 // 直接初始化具体类型可以省略

        val c:Int // 没有初始化需要指定具体类型,否则会报错
        
        c = 4
        println("a = $a, b = $b, c = $c")
    }
复制代码
    // 定义可变变量
    fun mutableVariable() {
        var x = 4 // Int 类型被推测出来
        x += 1
        println("x = $x")
    }
复制代码
    // 定义全局的变量
    val PI = 3.14
    var x = 23

    fun incrementX() {
        x += 1
    }

复制代码

注释

和 Java 一样,支持行尾注释和块注释。但是 Kotlin 的块注释可以嵌套。

    // 行尾注释
    
    /**
     * 块注释
     */

    /* 块注释
       块注释 */

    /* 嵌套块注释 /* 嵌套块注释 */ */
复制代码

字符串模板

    // 字符串模板
    // 和 groovy 一样使用 $,后面跟变量或者代码块。调用代码
    fun stringTemplates(){
        var a = 1
        val s1 = "a is $a"

        a = 2
        val s2 = "${s1.replace("is","was")},but now is $a"
    }
复制代码

条件语句

fun maxOf(a: Int, b: Int): Int {
        if (a > b) {
            return a
        } else {
            return b
        }
}    
复制代码

// 可以简写成

fun maxOf(a: Int, b: Int) = if (a > b) a else b
复制代码

使用可为空的类型

// 返回值后面有个?代表返回值可能为 null,没有?则代表一定不是 null
fun parseInt(str: String): Int? {
    // ...
}
复制代码

可能为 null 的情况就需要自己处理空值的情况


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
    }

    println(x * y)
}
复制代码

使用类型检查和自动转换

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // 不需要像 java 类型强转,Kotlin 自动推测这是 String 类型
        return obj.length
    }

    return null
}


fun getStringLength(obj: Any): Int? {
    if (obj !is String) {
        return null
    }
    // 不需要像 java 类型强转,Kotlin 自动推测这是 String 类型
    return obj.length
}

fun getStringLength(obj: Any): Int? {
    // 在 is 判断后面的判断都可以自动推测出 String 类型
    if (obj is String && obj.length > 0) {
        return obj.length
    }

    return null
}
复制代码

循环

for 循环

使用 in 和 index 2 种方式循环。

in 需要对象提供迭代器,类似 java foreach。

fun forLoopIn(){
    val items = listOf("apple","banana","kiwi")
    for (item in items){
        println(item)
    }
}

fun forLoopIndex(){
    val items = listOf("apple","banana","kiwi")
    for (i in items.indices){
        println("i = $i, item = ${items[i]}")
    }
}
复制代码

while 循环

while 还是和 java 一样

fun whileLoop() {
    val items = listOf("apple", "banana", "kiwi")
    var index = 0
    while (index < items.size) {
        println("item at $index is ${items[index]}")
        index++
    }
}
复制代码

when 选择语句

类似 switch

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

区间判断

检查一个数是否在一个区间里。用 in 关键字:

x..y 表示 [x,y] 的数。包括 x,y y downto x 表示从 y 到 x 开始倒序遍历

step 表示跳过几个数

fun checkNumber() {
    val x = 1.2
    val y = 9
    // x 是否在 [1,10] 闭区间
    if (x in 1..y + 1) {
        println("$x fits in range")
    }
}
复制代码

fun step() {
    // 按 1 3 5 7 9 跳过 2 个数
    for (x in 1..10 step 2) {
        print(x)
    }
}

fun downto(){
    println()
    // 9 downTo 0 是 [0,9] 的反序
    for (x in 9 downTo 0 step 3) {
        print(x)
    }
}
复制代码

集合

// 具有迭代器对象的集合遍历。类似 foreach
for (item in items) {
    println(item)
}
复制代码
// 使用 in 判断元素是否在集合中
fun checkItem() {
    val items = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
} 
复制代码
// 筛选出首字母 a 开头的元素,然后转成大写,打印
fun lambdaSample() {
    println()
    val fruits = setOf("apple", "banana", "kiwi")
    fruits.filter { it.startsWith("a") }
            .sortedBy { it }
            .map { it.toUpperCase() }
            .forEach { println(it) }
}
复制代码

实例

创建实例不需要 new 关键字。直接是 类名()

val a = A()
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值