Kotlin快速入门系列3

news2024/9/28 15:19:34

Kotlin条件循环控制

IF条件控制

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

fun compare(a:Int,b:Int) : Int{
    //常规传统用法
    var max = a
    if (b>a) max = b
    return max

    //使用else
    var mMax : Int
    if(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) return
    print(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@lit
        print(it)
    }
}

对应控制台输出为:

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

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

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

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

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

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

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

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

相关文章

【游戏客户端开发的进阶路线】

*** 游戏客户端开发的进阶路线 春招的脚步越来越近,我们注意到越来越多的同学们都在积极学习游戏开发,希望能在这个充满活力的行业中大展拳脚。 当我们思考如何成为游戏开发领域的佼佼者时,关键在于如何有效规划学习路径。 🤔 我…

【学网攻】 第(9)节 -- 路由器使用以及原理

系列文章目录 目录 系列文章目录 文章目录 前言 一、路由器是什么? 二、实验 1.引入 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan…

代码随想录算法训练营第32天 | 122.买卖股票的最佳时机II + 55. 跳跃游戏 + 45.跳跃游戏II

今日任务 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 122.买卖股票的最佳时机II - Medium 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i…

高中数学:集合

一、基本概念与关系 1、元素 2、集合 集合中元素的特性 1、确定性。2、无序性。3、互异性。 3、空集,用∅符号表示 4、元素与集合的关系是属于关系,用∈符号表示 5、集合与集合的关系是包含关系。用⊆或者⊊符号表示 子集与真子集。 A⊊B > A⊆B 反之…

HCIP复习课(bgp实验)

1、ip配置: R1: R2: R3: R4: R5: R6: R7: R8: 2、bgp配置: R1: R2: R3: R4: R5: R6:…

Apache Flink连载(二十六):TaskSlot任务槽-(1)-TaskSlotSlotSharingGroup

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 提交到集群中的Flink程序最终会转换成一个个的Subtask,Subtask是Flink任务调度的基本单元,这些t…

LaTeX基础使用【系列一】

🌈个人主页:godspeed_lucip 🔥 系列专栏:LaTeX基础使用 🌏1 LaTeX基本结构🍉1.1 基本结构🍉1.2 小tip1.2.1 注释的写法1.2.2 数学公式 🌏2 LaTeX中文的处理🥑2.1 前提工作…

C++ 重点内容:友元

目录 友元函数: 友元成员函数: 友元类: 友元是否有悖于OOP? 总结: 类因为具有封装和信息隐藏的特性(类外函数无法访问类的私有、保护成员),C提出友元解决特定的编程需要;友元分…

第八篇 交叉编译华为云Iot SDK到Orangepi3B

本篇主要内容: 一、交叉编译华为云Iot SDK依赖1.宿主机安装交叉编译工具链(1)选择下载交叉编译工具链(2)解压、添加环境变量、重启2.交叉编译依赖库(0) 准备工作(1) 交叉…

Ant Design Mini - 支付宝小程序官方推出的免费开源 UI 组件库,新增支持微信小程序,实用性大大增加

支付宝小程序官方的 UI 组件库开始支持运行在微信小程序上了,如果要开发这两家小程序平台,这套组件很合适。 Ant Design Mini 也简称 antd-mini ,是一套运行在支付宝小程序的 UI 组件库,UI 设计遵循 Ant Design 规范,…

【PyTorch】使用PyTorch创建卷积神经网络并在CIFAR-10数据集上进行分类

前言 在深度学习的世界中,图像分类任务是一个经典的问题,它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集,包含了10个类别的60000张32x32彩色图像。在本博客中,我们将探讨如何使用PyTorch框架创建一个简…

TensorFlow2实战-系列教程2:神经网络分类任务

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、Mnist数据集 下载mnist数据集: %matplotlib inline from pathlib imp…

vs2019报错MSB4019 找不到导入的项目“BuildCustomizations\CUDA 9.2.props”

在VS中执行生成,报错如下:严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4019 找不到导入的项目“D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 9.2.props”。请确认 Import 声明“D:\Microso…

在autodl训练yolov8时卡在下载字体

1.问题 在autodl训练yolov8到这一步之后会卡住很久 2. 解决办法 Ctric中断后发现是下载Arial字体卡住了,这个字体需要从外网中下载 先手动从链接中下载https://ultralytics.com/assets/Arial.ttf ,然后上传到autodl。然后将这个文件移动到/root/.config/…

机电制造ERP软件有哪些品牌?哪家的机电制造ERP系统比较好

机电制造过程比较复杂,涵盖零配件、采购、图纸设计、工艺派工、生产计划、物料需求计划、委外加工等诸多环节。而供应链涉及供应商的选择、材料采购价格波动分析、材料交货、品质检验等过程,其中某个环节出现问题都可能会影响产品交期和经营效益。 近些…

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

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

详讲api网关之kong的基本概念及安装和使用(一)

什么是api网关 前面我们聊过sentinel,用来限流熔断和降级,如果你只有一个服务,用sentinel自然没有问题,但是如果是有多个服务,特别是微服务的兴起,那么每个服务都使用sentinel就给系统维护带来麻烦。那么网…

Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

文章目录 摘要1.问题的提出引出当前研究的不足与问题KGC方法LLM幻觉现象解决方案 2.数据集和模型构建数据集模型方法基线方法任务模型方法基于LLM的KGC的知识前缀适配器知识前缀适配器 与其他结构信息引入方法对比 3.实验结果与分析结果分析:可移植性实验&#xff1…

那些年与指针的爱恨情仇(一)---- 指针本质及其相关性质用法

关注小庄 顿顿解馋 (≧∇≦) 引言: 小伙伴们在学习c语言过程中是否因为指针而困扰,指针简直就像是小说女主,它逃咱追,我们插翅难飞…本篇文章让博主为你打理打理指针这个傲娇鬼吧~ 本节我们将认识到指针本质,何为指针和…

k8s 版本发布与回滚

一、实验环境准备: kubectl get pods -o wide kubectl get nodes -o wide kubectl get svc 准备两个nginx镜像,版本号一个是V3,一个是V4 二、准备一个nginx.yaml文件 apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploylab…