Kotlin语法入门--变量声明(2)

Kotlin语法入门–条件控制和循环语句(2)

文章目录

  • Kotlin语法入门--条件控制和循环语句(2)
    • 二、条件控制和循环语句
      • 1、if...else
      • 2、when
        • 2.1、常规用法
        • 2.2、特殊用法--并列:
        • 2.3、特殊用法--类型判断:
        • 2.4、特殊用法--区间:
        • 2.5、返回值
      • 3、循环
        • 3.1、for..in
        • 3.2、forEach
        • 3.3、迭代器
        • 3.4、【扩展】for..in中的withIndex方法
        • 3.5、【扩展】forEachIndexed()方法
        • 3.6、do...while和while
      • 4、return,break,continue结束语句的使用
        • 4.1、结束循环分支
        • 4.2、标签备注代码块--@
        • 4.3、forEach退出循环的几种方式

二、条件控制和循环语句

1、if…else

常规分支:

fun main() {
    var a = 1
    if (a == 1) {
        println("a is 1")
    } else {
        println("a is not 1")
    }
}

kotlin新特性:if语句可以有返回值

fun main() {
    var a = 1
    val b = if (a == 1) {
        3
    } else {
        4
    }
    println(b)
}

像上述这种,假如条件成立,则赋值给a,返回值不用return 即可返回。

但是,注意的是假如要有返回值,则必须要写else分支。

image-20240417153651819

多分支已是如此:

fun main() {
    var a = 1
    val b = if (a == 1) {
        3
    } else if(a==3)  {
        4
    }else{
        5
    }
    println(b)
}

由于kotlin没有三元表达式,所以,可以使用if及其分支拟造一个三元表达式:

fun main() {
 var a = 1
 var b = 2
 val c = if (a == b) true else false
 println(c)
}

2、when

2.1、常规用法

关于when的用法,可以对标Java中的Switch,示例代码如下:

fun main() {
    var a = 1
    when (a) {
        1 -> println("a is 1")
        2 -> println("a is 2")
        else -> println("a is null")
    }

}

其中,else是默认输出语句,对标Java中的default

2.2、特殊用法–并列:
fun main() {
    var a = 1
    when (a) {
        1,3 -> println("a is 1")  //1或3
        2 -> println("a is 2")
        else -> println("a is null")
    }
}
2.3、特殊用法–类型判断:
fun main() {
    var a: Any = 1
    when (a) {
        is Int -> println("a is Int")
        is String -> println("a is String")
        else -> println("a is else")
    }
}
2.4、特殊用法–区间:
fun main() {
    var a: Any = 1
    when (a) {
        in 1..10 -> println("a is in range")
        is String -> println("a is a String")
        else -> println("none of the above")
    }
}

值得注意的是,每当判断到成立条件的时候,下面的条件不管成立否都不会执行。

还有,多个条件可以并列写,例如:

fun main() {
 var a: Any = 11
 when (a) {
     in 1..10,is Int -> println("a is in range or is Int")
     else -> println("none of the above")
 }
}
2.5、返回值

与if一样,kotlin的when也可以带上返回值,将返回值写在执行的最后一样即可:

fun main() {
    var a: Any = 11
    val b = when (a) {
        in 1..10 -> {
            println("a is in range")
            1
        }
        is Int -> {
            println("a is a Int")
            2
        }
        else -> {
            println("none of the above")
            3
        }
    }
    println(b)
}

3、循环

3.1、for…in
fun main() {
    var list = (1..<20).toList()
    for (i in list) {
        println(i)
    }
}
3.2、forEach

下述的forEach其实就是对原有的方法进行扩展,

fun main() {
    var list = (1..<20).toList()
    list.forEach {
        println(it)
    }
}

其循环默认名字是it,也可以用自定义的名字,例如下面value->:

fun main() {
    var list = ('a'..<'z').toList()
    list.forEach {value->
         println(value)
    }
}

其实其底层也就是一个lamda表达式进行赋值,然后进行for循环:

image-20240417164415857

3.3、迭代器

先看迭代器的方法:

image-20240417162941465

next():获取下一个元素的值,就像有一个指针,指向下一个值,并获取。

hasnext():判断是否存在下一个值,并且返回boolean值。

fun main() {
    var list = (1..<20).toList()
    var iterator = list.listIterator()
    while (iterator.hasNext()) {
        println(iterator.next())
    }
}
3.4、【扩展】for…in中的withIndex方法

image-20240417163753785

从上图可以看到,withIndex()方法要返回一个迭代器,其会返回一个对象,有下标index,和值i,可以通过kotlin的一个解构的方法获取:

fun main() {
    var list = ('a'..<'z').toList()
    for ((index,i)in list.withIndex()) {
        println("$index $i")
    }
}

输出:

image-20240417164130364

3.5、【扩展】forEachIndexed()方法
fun main() {
    var list = ('a'..<'z').toList()
    list.forEachIndexed{index, value->
         println("$index $value")
    }
}

forEachIndexed()方法:

image-20240417165201802

3.6、do…while和while

这两个语法没有变化,与常见语言的格式一样。

do…while:

fun main() {
    var i = 1
    do {
        println("$i")
    } while (i++ < 6)
}a

while:

fun main() {
    var i = 1
    while (i++ < 6) {
        println("$i")
    }
}

4、return,break,continue结束语句的使用

4.1、结束循环分支

例如:

fun main() {
    for (i in 1..10)
        for (j in 1..10) {
            if (i == 5 && j == 5) {
                break  //或者continue
            }
            println("$i $j ")
        }
}

解释:首先,break或者continue会优先执行的语句段是距离关键字(break或者continue)最近的循环关键字,所以上述代码中break的是j所在的for。

4.2、标签备注代码块–@
fun main() {
    a@for (i in 1..10)
        for (j in 1..10) {
            if (i == 5 && j == 5) {
                break@a //或者continue
            }
            println("$i $j ")
        }
}

像这段,就可以指定a@…@a这段代码区域执行break或者continue。

4.3、forEach退出循环的几种方式
fun main() {
    (1..<10).forEach {
        if (it == 5) {
            // 执行跳出循环                  
        }
        println(it)
    }
}

就像上述代码,想在it == 5的时候执行跳出循环 ,但是这个时候无法直接跳出循环,因为其底层是使用lamda表达式和函数实现的,即无法使用关键字break,continue。而使用return语句则会直接返回main函数,所以有下面几种写法:

  1. 寻找最近forEach,这样就不会打印5这个数字,就像continue一样。

    fun main() {
        (1..<10).forEach {
            if (it == 5) {
                 return@forEach // 执行跳过本次循环
            }
            println(it)
        }
    }
    
  2. a@…@a方式与return@forEach一样,跳过本次循环。

    fun main() {
        (1..<10).forEach  a@{
            if (it == 5) {
                 return@a // 执行跳过本次循环
            }
            println(it)
        }
    }
    
  3. run函数结束循环,类似于return函数那种感觉。

    fun main() {
        run {
            (1..<10).forEach{
                if (it == 5) {
                    return@run// 执行结束循环(run函数内的结束)
                }
                println(it)
            }
        }
    }
    
  4. 同理上述方法可以写成

    fun main() {
        run a@ {
            (1..<10).forEach{
                if (it == 5) {
                    return@a // 执行结束循环
                }
                println(it)
            }
        }
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/557703.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【笔试训练】day6

1.大数加法 思路&#xff1a; 高精度板子&#xff0c;停留一下都是罪过&#xff01; 代码&#xff1a; class Solution { public:string solve(string s, string t) {vector<int> a;vector<int> b;for(int is.size()-1;i>0;i--)a.push_back(s[i]-0);for(int …

AOP

代理模式 提出问题 现有缺陷 假设我们有一个计算类&#xff0c;里面有加减乘除四个方法&#xff0c;现在我们要为这四个方法添加日志&#xff0c;即在方法执行的前后分别输出一句话&#xff0c;这时我们会发现如下缺陷&#xff1a; 1.对核心业务有干扰。核心业务是加减乘除…

Transformer中的位置编码详解

什么是位置编码 位置编码概述 位置编码的目的是为了补充序列的位置信息&#xff0c;这是因为自注意力机制本身不包含位置的概念&#xff08;例如顺序信息&#xff09;。位置编码的具体作用是&#xff0c;对于不同的输入序列成分&#xff0c;赋予其不同的位置标识&#xff0c;确…

C++-命名空间

C 命名空间是一种用于组织代码的机制&#xff0c;可以帮助避免命名冲突&#xff0c;提高代码的可读性和可维护性。命名空间将代码分组到逻辑单元中&#xff0c;允许在不同的代码单元中使用相同的名称而不会产生冲突。 命名空间通过将代码放置在一个命名空间内部来实现。在 C 中…

被Claude3的图生代码技术秀到了,前端开发效率,提升到秒级

被Claude3的图生代码技术秀到了&#xff01;前端开发效率&#xff0c;提升到秒级 上传一张网站图片&#xff0c;用Claude3 生成实现这个网站的代码的教程来啦&#xff01; 在Claude3 的中文网站上一分钟就能实现&#xff0c;生成前端代码。中文网站地址是https://askmanyai.c…

探索 IntelliJ IDEA 2024.1最新变化:全面升级助力编码效率

探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率 文章目录 探索 IntelliJ IDEA 2024.1最新变化&#xff1a;全面升级助力编码效率摘要引言 IntelliJ IDEA 2024.1 最新变化关键亮点全行代码补全 Ultimate对 Java 22 功能的支持新终端 Beta编辑器中的粘性行 …

解决跨域和https不能访问的问题。

本地安装了项目,是一键安装的,安装之后还是apache的web服务器,有个视频服务用的是https的服务,要对这个项目进行二次开发,本地调用没问题,可是别人已调用就跨域。只能本地访问。 现在有两个问题:1.解决跨域问题 2.还要解决https访问的问题。 解决思路,用nginx 的ssl证…

本地项目如何设置https——2024-04-19

问题&#xff1a;由于项目引用了html5-qrcode插件&#xff0c;但是该插件在本地移动端调试时只能使用https访问&#xff0c;所有原本的本地地址是http&#xff0c;就需要改成https以方便调试。 解决方法&#xff1a;使用本地https证书 1&#xff09;从项目文件下打开cmd逐步输…

Springboot配置文件(application.yml)的加载顺序

spring boot 启动会扫描一下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 file…/config/ file…/ classpath:/config classpath:/ 以上是按照优先级从高到低的顺序&#xff0c;所有位置的文件都会被加载&#xff0c;高优先级配置内容会…

代码随想录算法训练营第四十四天| LeetCode70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

一、LeetCode 70. 爬楼梯 &#xff08;进阶&#xff09; 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html 状态&#xff1a;已解决 1.思路 这道题跟70.爬楼…

突破“三个九”!离子阱量子计算再创新高

如果把量子计算比作一场球赛&#xff0c;Quantinuum无疑又打了一记漂亮的好球。实际上&#xff0c;结合今年春季在量子体积、逻辑量子比特和布线问题等方面的进展&#xff0c;这个团队已经接近于完成一场完美的比赛。 3月&#xff0c;Quantinuum的研究人员证明了QCCD架构的可扩…

JavaScript 流程控制-循环

一、循环 二、 for 循环 重复执行的语句被称为循环体&#xff0c;能否继续重复执行&#xff0c;取决于循环的终止条件。 由循环体及循环的终止条件组成的语句被称为循环语句 1、语法结构 for 循环 主要用于把某些代码循环若干次&#xff0c;通常跟计数有关 for &#xff08…

springboot结合vue实现文件上传下载功能

紧接着上一次的博客&#xff0c;这次来实现一下文件(主要是图片)的上传和下载功能&#xff0c;上一次的博客如下所示&#xff1a; Springboot集成JWT token实现权限验证-CSDN博客 其实文件的上传和下载功能(后端的部分)&#xff0c;在我之前的博客就已经有写了&#xff0c;所以…

力扣经典150题第三十题:长度最小的子数组

目录 力扣经典150题解析之三十&#xff1a;长度最小的子数组1. 介绍2. 问题描述3. 示例4. 解题思路方法一&#xff1a;滑动窗口 5. 算法实现6. 复杂度分析7. 测试与验证测试用例设计测试结果分析 8. 进阶9. 总结10. 参考文献感谢阅读 力扣经典150题解析之三十&#xff1a;长度最…

重构国内游戏账号登录系统的思考和实践

本期作者 背景 账号登录系统&#xff0c;作为游戏发行平台最重要的应用之一&#xff0c;在当前的发行平台的应用架构中&#xff0c;主要承载的是用户的账号注册、登录、实名、防沉迷、隐私合规、风控等职责。合规作为企业经营的生命线&#xff0c;同时&#xff0c;账号登录作为…

数据结构系列-堆的实现

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 堆的实现&#xff0c;其实也就是二叉树的实现&#xff0c;我们在这里是基于数组对其进行实现的&#xff01; typedef struct Heap {HPDataType* a;int size;int capacity; }HP;…

毕业设计做一个linux操作系统怎么样?

毕业设计选择做操作系统的话&#xff0c;不太建议做的规模太大&#xff0c;你可以参考一下Linux内核的代码量&#xff0c;完全从头写的工作量还是挺大的。如果是一行一行从头写&#xff0c;学生期间&#xff0c;一学期写10000-20000行有效代码就很强了&#xff0c;而且还要学习…

【面经】2024春招-云计算后台研发工程师1(3个问题,移动TW等)

【面经】2024春招-云计算后台研发工程师1&#xff08;3个问题&#xff0c;移动&TW等&#xff09; 文章目录 岗位与面经基础1&#xff1a;数据库 & 网络&#xff08;3个问题&#xff09;基础2&#xff1a;系统 & 语法模板3&#xff1a;算法 & 项目&#xff08;移…

探索人工智能绘图的奇妙世界

探索人工智能绘图的奇妙世界 人工智能绘图的基本原理机器之美&#xff1a;AI绘图作品AI绘图对艺术创作的影响未来展望与挑战图书推荐&#x1f449;AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通内容简介获取方式&#x1f449;搜索之道&#xff1a;信息素养与终身…

Timelapse - 2024.04.09 -Win

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…