kotlin基础知识

发布时间 2023-10-11 23:56:08作者: LCAC

一、if的使用

1、if和java不一样的是:if是有结果的表达式

函数的返回值可以是:return if (a > b) a else b; 类似于java的 return a > b? a : b; 可能是这个原因所以kotlin没有这个三目运算符

 

二、函数体

kotlin除了循环外,大部分控制结构都是表达式体

1、函数体分为:代码块体和表达式体,带括号的是代码块,不带的则是表达式

// 代码块体
fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

// 表达式体
fun max(a: Int, b: Int) = if (a > b) a else b

如果我们要在if和else里面做更多的事情,可以增加括号如下所示

fun max(a: Int, b: Int) = if (a > b) {
    println("a>b")
    a // 因为是表达式,所以不能用:return a
} else {
    println("b>a")
    b // 因为是表达式,所以不能用:return b
}

如果使用return则会报错:error: returns are not allowed for functions with expression body.

 注意:这里表达式体没有显示写出来是因为可以从表达式中推导出对应的返回类型,所以表达式的结果类型一定要一致

 

三、变量

1、声明变量总是以关键字开始

val answer = 42

val answer: Int = 42

如上所示一个是显示类型声明,一个是省略类型声明;因为kotlin大部分都是表达式,所以等号右边是一个表达式,kotlin可以根据表达式的结果推出answer是Int类型

2、关键字val 类似于java中的final,只能进行一次初始化所以如下的方式都是可行的

    val c = 10
    val c: Int = 10
    val c = if (a > b) a else b
    val c: Int
    // 在之后的操作中对c进行初始化
    c = if (a > b) a else b  // 或者:if (a > b) c = a else c = b

如上的4种初始化方式都是可行的

 

四、类自定义访问器

当我们要描述类的特征或者属性时候,更倾向于把它声明成属性;比如:

class Rectangle(val height: Int, var width: Int) {
    val isSequare: Boolean
    get() {
        return height == width
    }
}

这里就把isSequare声明为属性val,通过get的方法获取对应的值;这里使用函数的方式:fun isSequare() = height == width 也是可以的,没有太大的区别。

 

五、枚举

这里用两个枚举的例子来说明枚举的结构

enum class Color {

RED, GREEN, BLUE

}

 

enum class Color(val r: Int, val g: Int, val b: Int) {

RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255); // 注意,这里必须有分号

fun rgb() = (r * 256 + g) * 256 + b

}

println(Color.BLUE.rgb())

如上有两种方式,一种是带成员变量一种是不带成员变量

都是以enum class 开头

 

六、when表达式

首先要注意的是:when也是一种表达式,可以有表达式的结果

when 有两种方式:一种是有参数一种是没有参数

interface Expr
class Num(val value: Int): Expr
class Sum(val left: Expr, val right: Expr): Expr

fun eval1(e: Expr): Int =
    when(e) { // 有参数e
        is Num -> e.value
        is Sum -> eval1(e.left) + eval1(e.right)
        else -> throw IllegalArgumentException("Unknown expression")
    }

fun eval2(e: Expr): Int = when { // 不带任何参数,那么下面的每个判断都需要是bool类型
    e is Num -> e.value
    e is Sum -> eval2(e.left) + eval2(e.right)
    else -> throw IllegalArgumentException("Unknown expression")
}

 

七、数列区间

0到100:0..100

0到99: 0 until 100

100到0: 100 downTo 0

表示步长:step

fun testRange() {
    for (i in 0..10) { // 0到10
        print("$i ")
    } // 0 1 2 3 4 5 6 7 8 9 10
    println()
    for (i in 0..10 - 1) { // 0到9
        print("$i ")
    } // 0 1 2 3 4 5 6 7 8 9 
    println()
    for (i in 0 until 10) { // 0到9
        print("$i ")
    } // 0 1 2 3 4 5 6 7 8 9 
    println()
    for (i in 0..10 step 2) {// 0到10步长为2
        print("$i ")
    } // 0 2 4 6 8 10 
    println()
    for (i in 10 downTo 0) { // 10到0
        print("$i ")
    } // 10 9 8 7 6 5 4 3 2 1 0 
    println()

    for (i in 10 downTo 0 step 2) { // 10到0,步长为2
        print("$i ")
    } // 10 8 6 4 2 0 
    println()
}

如上是区间的使用方式,主要是用在for循环

上面的for 有个关键字:in

这里in是表示是否在区间中,如果表示不在区间中则在in前面加感叹号:!in

注意:感叹号和in是连在一起的,中间不能有空格