Kotlin快速入门系列3

Kotlin条件循环控制

IF条件控制

与Java类似,一个if语句可包含布尔表达式和一条或多条语句。

fun compare(a:Int,b:Int) : Int{//常规传统用法var max = aif (b>a) max = breturn max//使用elsevar mMax : Intif(a>b){mMax = a}else{mMax = b}return mMax//使用表达式return if (a>b) a else b
}

在Kotlin中,这里声明的时候可以更加省略,当一个函数方法中只有一行代码时,Kotlin允许我们不用编写函数体可以直接将唯一的一行代码写在函数定义的尾部中间用等号连接即可我们统称这个为Kotlin的语法糖。

var num = if (a>b) a else b

这种语法糖用法非常重要,除了可以用于函数只有一行代码的情况外,还可以结合kotlin的很多其他语法来使用,在往后的编程示例中会用到其更多使用场景。

When表达式

类似与Java中的switch表达式,将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。

按照kotlin的语法糖设计,when既可以被当作语句使用也可以被当作表达式使用。

其最简单的表达形式如下:

when (input) {1 -> print("input == 1")2 -> print("input == 2")else -> print("input 既不是 1 ,也不是 2")
}

在when表达式中,else等同于switch中的default。如果其他分支都不满足条件将会在else分支中进行逻辑处理。如果很多分支需要相同的逻辑处理,则可以将那几个分支条件放在一起,用逗号分割:

when (input) {1,2 -> print("input == 1 or input == 2")else -> print("input 既不是 1 ,也不是 2")
}

当然,when语句的分支判断也可以用 in 运算符来进行范围逻辑判断:

when (input) {in 1..10 -> print("input is in the range 1~10")!in 10..20 -> print("input is outside the range 10~20")else -> print("none of the range")
}

运算符 in 也可以用来判断集合内是否包含某实例:

fun main() {val items = setOf("car", "house", "motor" ,"plane", "train")when {"bicycle" in items -> println("bicycle")"plane" in items -> println("plane is fine too")}
}

这段代码运行后在控制台输出如图:

当然也可以用is关键字来判断检测是否是一个特定类型的值。(由于kotlin的智能转换,可以访问该类型的方法和属性而无需任何额外的检测)。

fun isPerfectString(num: Any): Boolean{return when(num){is String -> num.startsWith("perfect")else -> false}
}

根据kotlin的语法糖,这段函数可以简化为:

fun isPerfectString(num: Any) = when (num) {is String -> num.startsWith("perfect")else -> false
}

when也可以用来取代if-else来做逻辑判断,在不提供参数进行逻辑比较情况下,所有分支条件都是简单的布尔表达式,当其中分支条件为真时则执行该分支逻辑:

when {num.equals("1") -> print("num equals 1")num == 1 -> print("num == 1")else -> print("num is other situation")
}

For循环 

for循环可以对任何提供迭代器的对象进行遍历操作,也可以是一段代码块:

for (element in array) print(element) //遍历集合对象for (element: Int in collection) {//遍历集合中的元素
}for (i in array.indices) {//遍历数组中的元素
}

在kotlin中,这种"在区间上遍历"不会创建额外对象,会编译成更加优化的实现。或者可以直接用库函数withIndex。

for ((index, value) in array.withIndex()) {println("the element at $index is $value")
}

写一个简单的示例:

fun main() {val items = listOf("car", "plane", "motor")for (item in items) {println(item)}for (index in items.indices) {println("item at $index is ${items[index]}")}
}

对应控制台输出为:

whiledo...while循环

与Java类似,while是最基本的循环,相应结构为:

while( 布尔表达式 ) {//循环体内容
}

与Java类似,do...while循环相对于while而言,多了一个条件判断,如果不满足条件,就不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。可以说do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

do {//逻辑代码
}while(布尔表达式);

代码结构基本与Java一致,这里不做赘述。

返回和跳转

Kotlin有三种结构跳转表达式:

✳️return:默认情况下从最近的函数或匿名函数返回。

✳️break:结束最直接包围它的闭合循环。

✳️continue: 继续下一次最直接包围它的闭合循环。

如下示例可表现其差异:

for (num in 1..10) {if (num==4) continue  // num 为 4 时跳过当前循环,继续下一次循环println(num)if (num>5) break   // num 为 6 时 跳出循环
}

对应控制台输出为:

Break和Continue标签

在Kotlin 中,任意表达式可以添加标签(label)。标签通过 @ 结尾来标识,比如:abc@,fooBar@ 都是有效的(参看语法)。使用标签表达式如下:

loop@ for (i in 1..100){// ...
}

现在,我们可以用标签来限制break或continue:

loop@ for (i in 1..100) {for (j in 1..100) {println(j)if (j==6) break@loop}
}

对应控制台输出为:

标签限制的break会跳转到刚好位于该标签指定的循环后面的执行点。而continue 继续标签指定的循环的下一次迭代,例如:

loop@ for (i in 1..5) {for (j in 1..5) {println(j)if (j==2) continue@loop}
}

对应的控制台输出为:

标签处返回

在字面函数,局部函数,以及对象表达式中,Kotlin 的函数(方法)可以被嵌套。而标签限制的 return 允许我们从外层函数返回。最重要的使用场景就是从lambda表达式中返回。

val ints = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8)
ints.forEach {if (it == 6) returnprint(it)
}

代码中的 return 指的是从 main 函数中返回,因为 main 函数是最直接包围它的函数,所以对应控制台输出为:

 如果我们需要从 lambda 表达式中返回,我们必须给它加标签 @lit 并用以限制 return:

fun main() {val ints = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8)ints.forEach lit@{if (it == 6) return@litprint(it)}
}

对应控制台输出为:

通常情况下使用隐式标签更方便。 该标签与接受该 lambda 表达式的函数同名,上述代码即表示为:

val ints = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8)
ints.forEach {if (it == 6) return@forEachprint(it)
}

其控制台对应输出也一致。

如果不使用标签,还可以使用匿名函数替代 lambda 表达式,匿名函数内部的 return 语句将从该匿名函数自身返回。

val ints = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8)
ints.forEach(fun(value: Int) {if (value == 6) returnprint(value)
})

 控制台运行结果也与之前一致。

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

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

相关文章

Unity中URP下额外灯的距离衰减

文章目录 前言一、额外灯的距离衰减二、DistanceAttenuation函数的传入参数1、distanceSqr2、distanceAndSpotAttenuation3、_AdditionalLightsAttenuation4、GetPunctualLightDistanceAttenuation函数三、DistanceAttenuation函数的程序体 前言 在上一篇文章中,我…

一个新的springboot-vue项目如何启动起来

一个新的springboot-vue项目如何启动起来 1.导入mysql 打开yml文件修改数据库密码 名称 用户名 2.打开pom.xml配置maven依赖 尽量换成自己使用过的版本号,或者打开中央仓库搜索相关内容版本号:https://central.sonatype.com/ 注解为黄色 说明工程…

《合成孔径雷达成像算法与实现》Figure5.17

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

@JsonIgnore的使用及相关问题的解决

目录 1 前言 2 对比及其使用方法 3 遇到的相关问题及解决方法 1 前言 在我们编写的后端项目中,有时候可能需要将某个实体类以JSON格式传送给前端,但是其中可能有部分内容我们并不想传送,这时候我们选择将这部分内容变成Null,这…

Flutter 点击空白处关闭软键盘,点击非TextField 关闭软键盘的方法

1:点击空白处(非控件上)关闭软键盘。 此方法有个问题,就是点击非空白区域,不会关闭软键盘,比如点击旁边的其他按钮,则软键盘还在。只适合点击空白处关闭软键盘 在 main.dart 入口 build 中增加 builder: (context, ch…

一文速通Python添加、修改和删除字典元素

添加、修改和删除字典元素是 Python 中使用字典时常见的操作。字典是一种无序、可变的数据结构,用于存储键值对。在 Python 中,对字典元素进行添加、修改和删除操作可以帮助我们动态地管理数据,方便地根据需求对字典进行更新和维护。 一、添…

图文解析交流慢充原理和握手协议以及OBC工作原理

1.接口定义 2.硬件连接原理 2.obc工作原理 OBC里面包括单片机1和单片机2,DSP。 有的厂家方案只有一个单片机,CC/CP部分直接用DSP实现。交流桩的ARM控制K1、K2,S1。单片机1控制K3。单片机2控制S2。DSP控制K4。BMS控制PDU里面的K5&#x…

使用Opencv-python库读取图像、本地视频和摄像头实时数据

使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单, 首先需要安装Python,然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…

Maven讲解

介绍 Maven是一个流行的构建工具和项目管理工具,它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理,简化了项目的开发和维护过程。 下面是一些Maven的主要特点和用途: 项…

Transformer and Pretrain Language Models3-6

Pretrain Language Models预训练语言模型 content: language modeling(语言模型知识) pre-trained langue models(PLMs)(预训练的模型整体的一个分类) fine-tuning approaches GPT and BERT(…

【阻塞队列】阻塞队列的模拟实现及在生产者和消费者模型上的应用

文章目录 📄前言一. 阻塞队列初了解🍆1. 什么是阻塞队列?🍅2. 为什么使用阻塞队列?🥦3. Java标准库中阻塞队列的实现 二. 阻塞队列的模拟实现🍚1. 实现普通队列🍥2. 实现队列的阻塞功…

立创EDA学习:设计收尾工作

布线整理 ShiftM,关闭铺铜显示 调整结束后再使用快捷键”ShiftM“打开铺铜 过孔 在空白区域加上一些GND过孔,连接顶层与底层的铺铜。放置好”过孔“后,隐藏铺铜,观察刚才放置的过孔有没有妨碍到其他器件 调整铺铜 先打开铺铜区&…

《Vue3 基础知识》 Vue2+ElementUI 自动转 Vue3+ElementPlus(GoGoCode)

前言 GoGoCode 一个基于 AST 的 JavaScript/Typescript/HTML 代码转换工具。 AST abstract syntax code 抽象语法树。 实现 第一步:安装 GoGoCode 插件 全局安装最新的 gogocode-cli 即可 npm i gogocode-cli -g查看版本 gogocode-cli -V相关插件说明 插件描述…

【多态】10分钟大白话讲解Java中的多态

1.多态的概念 多态(polymorphism)本来是生物学里的概念,表示地球上的生物在形态和状态方面的多样性。 而在java的面向对象中,多态通俗点说就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。也就是说…

先进计算产业促湖南数字经济规模突破1.7万亿元

中新网湖南新闻1月26日电 (于冬阳 周沁怡)“截至2023年底,集群汇聚了中电长城、飞腾、麒麟等1400余家企业,产值达1800亿元。”1月26日,国家新一代自主安全计算系统产业集年度工作推进会在长沙举行,国家新一代自主安全计算系统产业…

python-分享篇-使用海龟turtle模块实现幸福大转盘

文章目录 准备代码效果 准备 一、根目录下放图片 代码 from turtle import * import turtle from random import randint import sys #屏幕初始化 screen turtle.Screen() screen.title("幸运大转盘 转转转~") screen.setup(480,450) screen.bgpic("转盘.png…

Android底部导航栏创建——ViewPager + RadioGroup

Android底部导航栏有多种实现方式,本文详解其中的ViewPager RadioGroup方式的实现步骤。 我们先来看以下看一下最终做出的效果,使大家有个基本概念。 本结构特点: 1,ViewPager部分触摸左右滑动切换页面,RadioGroup部…

怎么获取二维码的链接?二维码转链接只需3步

怎么从二维码中提取内容呢?现在很多内容都会用二维码方式来存储,但是有些场景下二维码是无法使用的时候,想要查看二维码中的内容,就需要分解二维码成链接后使用。那么二维码分解成链接具体该怎么做呢?今天就将在线二维…

计算机组成原理--4.指令系统

一.指令格式 二.指令分类

【笔记】顺利通过EMC试验(16-41)-视频笔记

目录 视频链接 P1:电子设备中有哪些主要骚扰源 P2:怎样减小DC模块的骚扰 P3:PCB上的辐射源究竟在哪里 P4:怎样控制PCB板的电磁辐射 P5:多层线路板是解决电磁兼容问题的简单方法 P6:怎样处理地线上的裂缝 P7:怎样降低时钟信号的辐射 P8:为什么IO接口的处理特别重要 P9…