Kotlin学习笔记(2)---程序的逻辑控制

本文深入探讨Kotlin中的控制流语句,包括条件语句(if和when)、循环语句(for和while),以及运算符的使用与重载。详细介绍了Kotlin特有的when表达式的灵活性和for-in循环的高效性,同时讲解了如何在Kotlin中进行运算符重载和使用中缀表达式。

Kotlin学习笔记(2)—程序的逻辑控制及运算符

在进行一些业务逻辑的处理或者实现一些算法的时候,避免不了地需要使用诸如选择判断,循环控制之类的逻辑。

1.条件语句

在Kotlin中,条件语句主要有两种实现方式:if和when

1.1 if表达式:

在Kotlin中,if语句和Java中很像,在Kotlin中,if语句是可以有返回值的,这个返回值就是每个if条件的最后一行代码。还是之前的那个例子,比较两个数中比较小的那个数,在Kotlin中,我们可以这样写:

fun getMin(num1:Int,num2: Int):Int{
    var value = 0
    if (num1<num2){
        value = num1
    }else{
        value = num2
    }
    return value
}

这里if语句的用法与java中完全一致。然而我们上边提到了在Kotlin中,if语句是有返回值的,返回值就是if语句的最有一行。所以我们就可以将上方的getMin()方法修改成这样:

fun getMin(num1:Int,num2: Int):Int{
    return if (num1<num2){
         num1
    }else{
         num2
    }
}

直接返回一个if语句的返回值即可。到这里你是不是觉得已经精简了很多?用点子智慧嘛
想想我们之前提到的语法糖,是不是有灵感了,哈哈哈

在这里插入图片描述

fun getMin(num1:Int,num2: Int)=if (num1<num2){
         num1
    }else{
         num2
    }

然后简化一下就成了这样:

fun getMin(num1:Int,num2: Int)=if (num1<num2) num1 else num2

我的老天鹅,这简直是天壤之别。

1.2 when语句

when对标的其实是Java中的switch,但它更加是switch的升级版,它支持更多的参数类型。我们用一个简单的例子看看,用if语句实现:

fun getColor(name:String) = if(name == "banana"){
    "yellow"
} else if (name == "apple"){
    "red"
}else if(name == "peach"){
    "pink"
}else{
    "null"
}

如果用java的switch语句来写的话,就需要分很多的case,然后每个case结束之后还需要添加break来进行case的结束,否则将会继续进行判断。
而在Kotlin中,我们就可以这样写:

fun getColor(name:String) = when(name){
    "banana"->"yellow"
    "apple"->"red"
    "peach"->"pink"
    else->"black"
}

是不是简单明了?
还有一种when中不加参数的写法:

fun getColor(name:String) = when{
    name == "banana"->"yellow"
    name == "apple"->"red"
    name == "peach"->"pink"
    else->"black"
}

在Kotlin中,“==” 代表了判断内容相等 ,“ ===”号代表了判断内存地址相等
这样的话,可能有些人会觉得没有必要。但是如果有这样一个场景,所有b开头的东西,我们都想让他变成黄色,那么就可以这样写:

fun getColor(name:String) = when{
    name.startsWith("b") ->"yellow"
    name == "apple"->"red"
    name == "peach"->"pink"
    else->"black"
}

2 .循环语句

在Java中,有两种循环语句:for循环和while循环。而在Kotlin中,也提供了for循环和while循环,其中while循环在语法上与java中的while循环是一样的,这里就不做赘述。我们一起看看for循环。

2.1 for循环

java中的for循环有for-i循环和for-each循环。在Kotlin中,舍弃了for-i循环,而大大加强了for-each循环,形成了Kotlin独有的for-in循环。Kotlin的for-each循环的参数都需要实现Iterator迭代器。
首先我们知道,对于一个循环来说最重要的就是循环区间。而在Kotlin中,区间有一种特殊的表示方法:

0..10

这句话代表了从0到10的闭区间,即[0,10],知道区间的写法之后,就可以来写我们的for-in循环了,我们试着输出一下从0到10所有的数:

 for (i in 0..10){
        println(i)
    }

在日常情况下,我们用到最多的是左闭右开区间,例如一个长度为10的数组的下标范围是0-9.即[0,9)。在Kotlin中,可以用until关键字来标识一个左闭右开的区间。那么如果我们想要输出0-9的话,就可以写成:

  for (i in 0 until 10){
        println(i)
    }

然后有时候,我们会通过操作i来控制循环,在上面的两个例子中,i都是一直在累加的,而我们有时候需要将i进行i=i+2,i=i+3等运算,那我们就可以这样写:

    for (i in 0 until 10 step 3){
        println(i)
    }

如果我们要用到一个降序区间的话,可以这样写:

   for (i in 10 downTo  0 step 3){
        println(i)
    }

当我们需要知道元素的下标时,则可以使用array.withIndex()方法,举个🌰:

fun main(args:Array<String>) {
 val array  = arrayOf("a","b","c","d","e","f")

    for ((index,value) in array.withIndex()){
        println("$index -> $value")
    }
}

但其实这里这个匿名对象(index,value)其实是一个叫做indexValue的对象,所以也可以写成这样:

fun main(args:Array<String>) {
 val array  = arrayOf("a","b","c","d","e","f")

    for (indexValue in array.withIndex()){
        println("${indexValue.index} -> ${indexValue.value}")
    }
}

当我们需要跳过循环时,可以使用continue关键字,当需要跳出循环时,可以使用break关键字。

fun main(args:Array<String>) {
 val array  = arrayOf("a","b","c","d","e","f")

    for (word in array){
        if (word == "c")continue
        println(word)
        if (word == "e")break
    }
}

执行结果如下:
在这里插入图片描述

2.2 while循环

Kotlin中while循环与Java中用法已知,也存在while与do-while循环两种。

3.运算符

3.1 运算符重载

在kotlin中,任何类都可以定义或者重载父类的基本运算符。在定义时应通过运算符对应的具名函数来定义,如定义 “+”,则需要定义plus方法。举个🌰:

    class Book(var num: Int) {
        operator fun plus(other: Book): Book {
            return Book(num + other.num)
        }
        override fun toString(): String {
            return "num is $num"
        }
}

fun main() {
    val b1 = OperatorTest.Book(1)
    val b2 = OperatorTest.Book(3)

    println(b1 + b2)
}

我们给Book类定义操作符“+”,让两个Book对象在进行“+”操作时 ,运算属性num的和,生成新的Book对象。
代码执行结果如下:
在这里插入图片描述
需要注意的是:

  • 在进行运算符重载时,对参数的个数有明确的要求,但对参数的类型与返回值的类型没有要求
  • 在进行运算符重载时,只能重载已有的运算符如“+,”-“等,不能定义未被父类定义的运算符。

3.2 中缀表达式

当一个函数只有一个参数的时候,可以使用infix关键字去修饰这个方法,将其转换为一个中缀表达式。
举个🌰:

 class Book(var num: Int) {
        infix fun seal(count: Int):Book{
            return Book(num-count)
        }
        override fun toString(): String {
            return "num is $num"
        }
}

fun main() {
    val b2 = OperatorTest.Book(3)
    print(b2 seal 1)
}

在这里我们定义了一个seal方法,接收一个int类型的参数,返回一个Book类型的值。代码执行结果如下:
在这里插入图片描述

4.异常捕获

Kotlin中try-cache也是表达式,可以在末尾返回语句。除此以外与Java语言中的用法基本相同

5.参数传递

5.1 具名参数

当调用函数时,显示的指定形参对应传入的参数时,就叫做具名参数,例如:

fun main(args:Array<String>) {

    println(sum(num1 = 1,num2 = 2))
}

fun sum(num1: Int,num2: Int):Int{
    return num1+num2
}

5.2 变长参数

可以使用vararg来定义变长参数,在java中变长参数一般使用类型+"…"来规定,且必须处于函数参数列表的最后一位,例如String…
而在Kotlin中,因为具名参数存在的关系,变长参数可以处于函数参数列表的任意位置,举个🌰:

fun main(args:Array<String>) {

    sum(1,2,3,4,5, name = "tom")
}

fun sum(vararg scores:Int,name:String){
    println("name = $name")
   scores.forEach (::println)
}

当我们传递参数时,变长参数此时处于一个数组之中,那么我们可以使用展开操作符对数组进行展开。要注意此操作符只能展开数组,不能展开List,且只能用于向变长参数传递实参时使用,不能重载
例如:

fun main(args:Array<String>) {
    val array = intArrayOf(1,2,3,4,5)
    sum(*array, name = "tom")
}

fun sum(vararg scores:Int,name:String){
    println("name = $name")
   scores.forEach (::println)
}

5.3 默认参数

在使用默认参数时,只需要在函数声明除对形参赋值即可。默认参数可以出现在参数列表的任意位置,但需要注意点的是,默认参数后边的参数都需要使用具名参数去指定,否则编译器将不能识别参数。所以一般使用默认参数的时候,最好放在函数列表的最后方。
例如:

fun main(args:Array<String>) {
    val array = intArrayOf(1,2,3,4,5)
    sum(*array)
}

fun sum(vararg scores:Int,name:String="admin"){
    println("name = $name")
   scores.forEach (::println)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值