Kotlin(一)语法基础

本文介绍了Kotlin语言的基础知识,包括包的定义、方法定义、局部变量的定义等内容,并通过示例详细展示了条件表达式、类型检查、循环结构等语法特性。

1. 包的定义

kotlin与java一样,包的声明需要在源文件的顶部

package my.demo
import java.util.*
// …

2. 方法定义

下面的方法有两个Int型参数和一个Int型返回值

//sampleStart
fun sum(a: Int, b: Int): Int {
    return a + b
}
//sampleEnd

fun main(args: Array<String>) {
    print("sum of 3 and 5 is ")
    println(sum(3, 5))
}

方法也可以直接把一个表达之复制给方法声明作为返回值

//sampleStart
fun sum(a: Int, b: Int) = a + b
//sampleEnd

fun main(args: Array<String>) {
    println("sum of 19 and 23 is ${sum(19, 23)}")
}

无返回值的函数可以下面这样定义

//sampleStart
fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
//sampleEnd

fun main(args: Array<String>) {
    printSum(-1, 8)
}

当然,无返回值得函数Unit可以省略

//sampleStart
fun printSum(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}
//sampleEnd

fun main(args: Array<String>) {
    printSum(-1, 8)
}

3. 局部变量的定义

  • 只读型局部变量
fun main(args: Array<String>) {
//sampleStart
    val a: Int = 1  // immediate assignment
    val b = 2   // `Int` type is inferred
    val c: Int  // Type required when no initializer is provided
    c = 3       // deferred assignment
//sampleEnd
    println("a = $a, b = $b, c = $c")
}
  • 可变型变量
fun main(args: Array<String>) {
//sampleStart
    var x = 5 // `Int` type is inferred
    x += 1
//sampleEnd
    println("x = $x")
}

4. 注释

kotlin中注释与java中一样

// This is an end-of-line comment

/* This is a block comment
   on multiple lines. */

5. 字符串的格式化

fun main(args: Array<String>) {
//sampleStart
    var a = 1
    // simple name in template:
    val s1 = "a is $a" 

    a = 2
    // arbitrary expression in template:
    val s2 = "${s1.replace("is", "was")}, but now is $a"
//sampleEnd
    println(s2)
}

6. 条件表达式的使用

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

7. 对null的检查

当返回值可能为null的时候引用必须准确的表明是否允许为null

下面的Int?表示当返回值不是Integer的时候,方法返回null

fun parseInt(str: String): Int? {
    // ...
}

下面的函数用来检查参数是否为null

fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
    val x = parseInt(arg1)
    val y = parseInt(arg2)

    // Using `x * y` yields error because they may hold nulls.
    if (x != null && y != null) {
        // x and y are automatically cast to non-nullable after null check
        println(x * y)
    }
    else {
        println("either '$arg1' or '$arg2' is not a number")
    }    
}


fun main(args: Array<String>) {
    printProduct("6", "7")
    printProduct("a", "7")
    printProduct("a", "b")
}

结果

42
either 'a' or '7' is not a number
either 'a' or 'b' is not a number

或者下面这样

fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

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
    }

    // x and y are automatically cast to non-nullable after null check
    println(x * y)
}

fun main(args: Array<String>) {
    printProduct("6", "7")
    printProduct("a", "7")
    printProduct("99", "b")
}
42
Wrong number format in arg1: 'a'
Wrong number format in arg2: 'b'

8. 类型检查和自动转型的使用

用来检查返回的表达式是否是一个类型的实例,如果是特定类型的不可变局部变量或者属性检查,则不需要显示转换(不是很理解)。

fun getStringLength(obj: Any): Int? {
    if (obj is String) {
        // `obj` is automatically cast to `String` in this branch
        return obj.length
    }

    // `obj` is still of type `Any` outside of the type-checked branch
    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()))
}

9. For循环

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

或者这样

val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}

10. while循环的使用

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

11. when表达式的使用

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

这里和java中的switch作用相同


12. 范围表达式的使用

  • 下面的表达式合一检查数字是否在某个范围之内
val x = 10
val y = 9
if (x in 1..y+1) {
    println("fits in range")
}
  • 下面的表达式检查数字是否超出某个范围
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")
}
  • 范围内进行迭代遍历
for (x in 1..5) {
    print(x)
}
  • 也可以跳跃遍历

for (x in 1..10 step 2) {
    print(x)
}
for (x in 9 downTo 0 step 3) {
    print(x)
}

第一个循环表示从1到10,每次跳过一个数字,所以及结果13579
第二个循环表示从9到0,每次跳过2个数字,所以结果是9630


13. 集合的使用

  • 集合的迭代遍历
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 = setOf("apple", "banana", "kiwi")
    when {
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}
  • 也可以用lambda表达式来过滤集合
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) }
}

结果是

APPLE
AVOCADO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值