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 = 1if (a == 1) {println("a is 1")} else {println("a is not 1")}
}

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

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

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

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

image-20240417153651819

多分支已是如此:

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

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

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

2、when

2.1、常规用法

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

fun main() {var a = 1when (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 = 1when (a) {1,3 -> println("a is 1")  //1或32 -> println("a is 2")else -> println("a is null")}
}
2.3、特殊用法–类型判断:
fun main() {var a: Any = 1when (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 = 1when (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 = 11when (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 = 11val 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 = 1do {println("$i")} while (i++ < 6)
}a

while:

fun main() {var i = 1while (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)}}
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言进阶课程学习记录-第48课 - 函数设计原则

C语言进阶课程学习记录 - 函数设计原则 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录

无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

无人驾驶 百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用…

Linux i2c-tool工具基础使用

一.i2cdetect i2cdetect 是一个用户空间程序&#xff0c;用于扫描 I2C 总线上的设备。它输出一个表格&#xff0c;其中包含指定总线上检测到的设备列表。以下是 i2cdetect 的使用方法&#xff1a; 运行扫描&#xff1a; 要执行 I2C 扫描&#xff0c;请使用以下命令&#xff1…

解决Java Heap Space问题的排查与优化方法

引言&#xff1a; 在 Java 开发中&#xff0c;经常会遇到 “java heap space” 错误&#xff0c;这意味着程序需要更多的堆内存来执行所需的操作。本文将介绍如何排查和解决这个问题&#xff0c;并提供一些优化方法&#xff0c;以避免类似的错误发生。 1. 确认错误信息 当遇到…

端口被占用的解决方案汇总

端口被占用的解决方案汇总 【一】windows系统端口被占用【二】Linux系统端口被占用【三】Linux的ps命令查找&#xff08;1&#xff09;ps命令常用的方式有三种&#xff08;2&#xff09;ps -ef |grep 8080 【一】windows系统端口被占用 &#xff08;1&#xff09;键盘上按住Wi…

【LeetCode刷题记录】21. 合并两个有序链表

21 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 …

# MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

密码学系列4-选择密文安全,同态加密安全性

本章将介绍Cramer-Shoup加密方案,并证明其安全性。最后讨论了同态加密方案的安全性证明 一、Cramer-Shoup加密 密钥生成 1.定义群 G G G,群的阶为 q q q,选取群的生成元

调试 WebSocket API 技巧分享

WebSocket 是一种在单个 TCP 连接上实现全双工通信的先进 API 技术。与传统的 HTTP 请求相比&#xff0c;WebSocket 提供了更低的延迟和更高的通信效率&#xff0c;使其成为在线游戏、实时聊天等应用的理想选择。 开始使用 Apifox 的 WebSocket 功能 首先&#xff0c;在项目界…

node和go的列表转树形, 执行速度测试对比

保证数据一致性&#xff0c;先生成4000条json数据到本地&#xff0c;然后分别读取文本执行处理 node代码 node是用midway框架 forNum1:number 0forNum2:number 0//执行测试async index(){// 生成菜单列表// const menuList await this.generateMenuList([], 4000);const men…

密码学系列5-BLS短签名和存在不可伪造性(EUF-CMA)

本章将给出BLS短签名方案和方案的安全性证明。这个方案是很多签名方案的基础方案,学会这一个方案,也就学会了这一系列方案的安全性证明。 注:签名方案:私钥签名,公钥验证;加密方案:公钥加密,私钥解密。 论文名:Short signatures from the Weil pairing 一、BLS短签名 …

双周总结#008 - AIGC

本周参与了公司同事对 AIGC 的分享会&#xff0c;分享了 AIGC 在实际项目中的实践经验&#xff0c;以及如何进行 AIGC 的落地。内容分几项内容&#xff1a; 什么是 AIGCAIGC 能做什么AIGC 工具 以年终总结为例&#xff0c;分享了哪些过程应用了 AIGC&#xff0c;以及 AIGC 落地…

FPGA ——Verilog语法示例

FPGA ——Verilog语法示例 多模块定义条件判断 多模块定义 genvar i ;generatefor (i0 ; i<8; ii1)beginxdc xdc_u(.d1 (d1 ) ,.d2 (d2 ) ,.d3 (d3 ));end endgenerate条件判断 generate beginif(DEBUG "ON")beginila ila_u(.clk(clk),.probe0({A1,A2,A3,A4}))…

QA测试开发工程师面试题满分问答19: url请求到响应整个过程,涉及到什么技术细节

概述 当你点击鼠标发起一个请求&#xff0c;直到页面显示响应数据&#xff0c;整个过程可以详细展开为以下步骤&#xff1a; 用户点击鼠标&#xff1a;用户在浏览器中点击某个链接或按钮&#xff0c;触发请求的发起。 URL 解析&#xff1a;浏览器解析点击的链接中的 URL&…

在线音乐播放网站项目测试(selenium+Junit5)

在做完在线音乐播放网站项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#…

下列程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),该函数的功能是:使数组右上半三角元素中的值乘以m。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 下列…

数据库管理-第174期 执行计划的改变竟如此复杂(20240423)

数据库管理174期 2024-04-23 数据库管理-第174期 执行计划的改变竟如此复杂&#xff08;20240423&#xff09;1 大量等待2 性能问题排查3 为什么执行计划会改变3.1 统计信息不准确3.2 表数据量过大3.3 错误索引 4 优化建议总结 数据库管理-第174期 执行计划的改变竟如此复杂&am…

【QML】State组件

State(状态)组件是一组来自默认配置的批处理更改。所有项都有一个默认状态&#xff0c;该状态定义对象和属性值的默认配置。可以通过将State项添加到states属性来定义新的状态&#xff0c;以允许项在不同的配置之间切换。 State组件的基本用法如下&#xff1a; Window {id: …

在Linux中,按上下左右键为什么变成^[[A^[[B^[[C^[[D

在Linux中&#xff0c;当你按下键盘上的箭头键时&#xff0c;通常会发送相应的转义序列给终端。这些转义序列告诉终端程序如何解释按键的含义。例如&#xff0c;按下箭头键时&#xff0c;可能会发送类似于^[[A、^[[B、^[[C、^[[D这样的序列。 这些序列的开头^[[实际上是转义字…

终端安全加强

1. 加强密码管理 对于重要数据和系统&#xff0c;必须采用复杂的密码进行保护&#xff0c;并定期更换密码。同时&#xff0c;要加强对员工密码的管理&#xff0c;确保每个员工有一个独立的账号和密码&#xff0c;并限制其使用权限。 2. 实施访问控制 对于终端设备的访问要进…