当前位置: 首页 > news >正文

Kotlin | 在for、forEach循环中正确的使用break、continue

文章目录

      • for循环中使用break、continue
      • Label标签
      • forEach中如何退出循环
      • 资料

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

  • return:默认从最直接包围它的函数或者匿名函数返回。
  • break:终止最直接包围它的循环。
  • continue:继续下一次最直接包围它的循环。

for循环中使用break、continue

fun forControl() {for (i in 1..5) {if (i == 3) break //1 这里分别使用break continue returnprintln("i: $i")}println("循环外继续执行")
}

1处分别使用break、continue、return 替换,执行结果如下:

//break 
i: 1
i: 2
循环外继续执行//continue
i: 1
i: 2
i: 4
i: 5
循环外继续执行//return
i: 1
i: 2

嗯,跟Java中的使用姿势是一样的,继续往下看。

Label标签

在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、loop@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。示例:

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

这里在嵌套for循环中使用Label,可以控制break及continue的范围:

fun forNestedControl() {loop@ for (i in 1..2) {println("i: $i")for (j in 1..5) {if (j == 3) break@loop //break continueprintln("j: $j")}}
}

执行结果:

//break
i: 1
j: 1
j: 2
循环外继续执行//continue
i: 1
j: 1
j: 2i: 2
j: 1
j: 2
循环外继续执行

注意不能在上述代码中使用return@loop,因为目标标签表示的不是函数,错误信息如下:

Target label does not denote a function

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

forEach中如何退出循环

在forEach中并不能直接使用break、continue:

break/continue错误使用
可以看到直接报错了,错误信息也很明确:break 和 continue 只允许在循环中使用,而这里是forEach的闭包,所以并不能直接使用break 和 continue。那么如何在forEach中分别模拟出break、continue的效果呢?通过Label即可实现,如:

fun forEachControl() {listOf(1, 2, 3, 4, 5).forEach forEach@{if (it == 3) return@forEachprintln("it:$it")}println("循环外继续执行")
}

return 只会从 lambda 表达式中返回。通常情况下使用隐式标签更方便(Label 标签与接受该 lambda 的函数同名即可使用隐式标签),简化之后:

fun forEachControl() {listOf(1, 2, 3, 4, 5).forEach{if (it == 3) return@forEachprintln("it:$it")}println("循环外继续执行")
}

代码执行结果:

it:1
it:2
it:4
it:5
循环外继续执行

可以看到return@forEach相当于表达式里面的continue了。嗯哼?为什么不是break的效果呢?明明已经return@forEach了呀,其实这是Kotlin闭包带来的副作用,看下forEach的源码:

public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {//注意看下面这行代码的逻辑for (element in this) action(element)
}

action闭包作为参数传入的,所以在forEach中return@forEach只能停止当前闭包的逻辑,后面的循环并不会受影响,会继续后面的循环。那么如何在forEach中模拟break的效果呢?只要把声明Label放到forEach外面即可以了:

fun forEachControl() {run loop@{listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return@loopprintln("it:$it")}println("循环外继续执行")}}

执行结果:

it:1
it:2

资料

【1】Kotlin返回和跳转:https://www.kotlincn.net/docs/reference/returns.html

相关文章:

Kotlin | 在for、forEach循环中正确的使用break、continue

文章目录 for循环中使用break、continueLabel标签forEach中如何退出循环资料 Kotlin 有三种结构化跳转表达式&#xff1a; return&#xff1a;默认从最直接包围它的函数或者匿名函数返回。break&#xff1a;终止最直接包围它的循环。continue&#xff1a;继续下一次最直接包围…...

【C++】详解std::mutex

2023年9月11日&#xff0c;周一中午开始 2023年9月11日&#xff0c;周一晚上23&#xff1a;25写完 目录 概述头文件std::mutex类的成员类型方法没有std::mutex会产生什么问题问题一&#xff1a;数据竞争问题二&#xff1a;不一致lock和unlock死锁 概述 std::mutex是C标准库中…...

Matlab图像处理-Lab模型

Lab模型 Lab模型是由CIE&#xff08;国际照明委员会&#xff09;制定的一种彩色模型。该模型与设备无关&#xff0c;弥补了RGB模型和CMYK模型必须依赖于设备颜色特性的不足&#xff1b; 另外&#xff0c;自然界中的任何颜色都可以在Lab空间中表现出来&#xff0c;也就是说RGB和…...

分布式ETL工具Sqoop实践

Mysql数据准备 1、在node02节点登录Mysql。 mysql -uroot -proot2、新建数据库testdb。 create database testdb;3、新建数据表ts。 use testdb; create table ts(id int, name varchar(10), age int, sex char(1));4、向表中插入数据。 insert into ts values(10001,张三…...

展会预告 | 图扑邀您共聚 IOTE 国际物联网展·深圳站

参展时间&#xff1a;9 月 20 日- 22 日 图扑展位&#xff1a;9 号馆 9B 35-1 参展地址&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; IOTE 2023 第二十届国际物联网展深圳站&#xff0c;将于 9 月 20 日- 22 日在深圳国际会展中心&#xff08;宝安&#xf…...

如何下载安装 WampServer 并结合 cpolar 内网穿透,轻松实现对本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…...

iOS添加Mapbox地图库

配置凭据 注册并导航到Account页面。你将需要&#xff1a; 公共访问令牌&#xff1a; 从帐户的tokens页面&#xff0c;你可以复制默认的公共令牌或单击"create a token"按钮来创建新的公共令牌。 带有Downloads:Read范围的秘密访问令牌&#xff1a; 从你帐户的t…...

destoon根据目录下的html文件生成地图索引

因为项目需要&#xff0c;destoon根据目录下的html文件生成地图索引&#xff0c;操作方法&#xff0c;代码如下&#xff1a; <?php $new_array array(); function loopDir($dir,&$new_array,$modurl) {$handle opendir($dir);header("Content-Type:text/xml&qu…...

gRPC之gRPC流

1、gRPC流 从其名称可以理解&#xff0c;流就是持续不断的传输。有一些业务场景请求或者响应的数据量比较大&#xff0c;不适合使用普通的 RPC 调用通过一次请求-响应处理&#xff0c;一方面是考虑数据量大对请求响应时间的影响&#xff0c;另一方面业务场景的设计不一 定需…...

Kafka Shell命令交互

Kafka提供了一个命令行工具,用于管理和与Kafka集群交互。这个命令行工具通常称为Kafka Shell,它允许您执行各种操作,如创建主题、发送和消费消息、查看主题列表等。 以下是一些常用的Kafka Shell命令: 创建主题(Topic): kafka-topics.sh --create --topic my-topic --pa…...

什么是回归测试?

什么是回归测试&#xff1f; 回归测试被定义为一种软件测试类型&#xff0c;以确认最近的程序或代码更改未对现有功能产生不利影响。 回归测试只不过是全部或部分选择已执行的测试用例&#xff0c;然后重新执行以确保现有功能正常运行。 进行此测试是为了确保新代码更改不会…...

ZTMap是如何在相关政策引导下让建筑更加智慧化的?

近几年随着智慧楼宇概念的深入&#xff0c;尤其是在“十四五规划”“新基建”“数字经济”等相关战略和政策的引导下&#xff0c;智慧楼宇也迎来了快速发展期&#xff0c;对推动智慧城市系统的建设越来越重要。那么究竟什么是智慧楼宇呢&#xff1f;智慧楼宇其实就是整合楼宇内…...

Python:函数和代码复用

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 1、关于递归函…...

three.js——模型对象的使用材质和方法

模型对象的使用材质和方法 前言效果图1、旋转、缩放、平移&#xff0c;居中的使用1.1 旋转rotation&#xff08;.rotateX()、.rotateY()、.rotateZ()&#xff09;1.2缩放.scale()1.3平移.translate()1.4居中.center() 2、材质属性.wireframe 前言 BufferGeometry通过.scale()、…...

sql explain

目录 1. sql explain每个字段对应的含义1.1. id1.2. select_type1.3. table1.4. partitions1.5. type1.6. possible_keys1.7. key1.8. key_len1.9. ref1.10. rows1.11. Extra 索引实践联合索引最左列原则全值匹配不建议在索引列上做任何操作, 否则索引会失效转而全表扫描尽量使…...

【LeetCode-简单题】剑指 Offer 05. 替换空格

文章目录 题目方法一&#xff1a;常规做法&#xff1a;方法二&#xff1a;双指针做法 题目 方法一&#xff1a;常规做法&#xff1a; class Solution {public String replaceSpace(String s) {int len s.length() ;StringBuffer str new StringBuffer();for(int i 0 ; i &l…...

数字虚拟人制作简明指南

如何在线创建虚拟人&#xff1f; 虚拟人&#xff0c;也称为数字化身、虚拟助理或虚拟代理&#xff0c;是一种可以通过各种在线平台与用户进行逼真交互的人工智能人。 在线创建虚拟人变得越来越流行&#xff0c;因为它为个人和企业带来了许多好处。 推荐&#xff1a;用 NSDT编辑…...

Nginx 文件解析漏洞复现

一、漏洞说明 Nginx文件解析漏洞算是一个比较经典的漏洞&#xff0c;接下来我们就通过如下步骤进行漏洞复现&#xff0c;以及进行漏洞的修复。 版本条件&#xff1a;IIS 7.0/IIS 7.5/ Nginx <8.03 二、搭建环境 cd /vulhub/nginx/nginx_parsing_vulnerability docker-compos…...

Lombok依赖

一.介绍 Project Lombok 是一个 Java 库&#xff0c;它会自动插入编辑器和构建工具&#xff0c;为您的 Java 增添趣味。永远不要再写另一个 getter 或 equals 方法&#xff0c;使用一个注释&#xff0c;您的类有一个功能齐全的构建器&#xff0c;自动化您的日志记录变量等等。…...

XML 和 JSON 学习笔记(基础)

XML Why XML 的出现背景&#xff1a;在实际开发中&#xff0c;不同语言&#xff08;如Java、JavaScript等&#xff09;的应用程序之间数据传递的格式不同&#xff0c;导致它们进行数据交换时很困难&#xff0c;XML就应运而生了&#xff01;&#xff08;XML 是一种通用的数据交…...

BEP-20代币全解析:从原理到实战,赋能Web3开发

BEP-20代币全解析&#xff1a;从原理到实战&#xff0c;赋能Web3开发 引言 在百花齐放的区块链世界中&#xff0c;币安智能链&#xff08;BNB Chain&#xff09; 凭借其低廉的手续费与闪电般的交易速度&#xff0c;迅速成为众多开发者和项目方的热土。而这一切繁荣生态的基石…...

SpringBoot项目实战:5分钟集成EasyExcel,搞定带复杂合计与中文金额的Excel导出

SpringBoot实战&#xff1a;5分钟集成EasyExcel实现智能Excel导出 在企业管理系统的开发中&#xff0c;Excel导出几乎是每个项目都会遇到的刚需功能。传统POI操作Excel的繁琐代码让很多开发者头疼不已&#xff0c;而Alibaba开源的EasyExcel则彻底改变了这一局面。本文将带你用S…...

AI Agent Harness Engineering 的安全与伦理挑战:我们如何控制所创造之物?

AI Agent Harness Engineering 的安全与伦理挑战&#xff1a;我们如何控制所创造之物&#xff1f; 关键词&#xff1a;AI Agent 治理、Harness Engineering、对齐问题、灾难性遗忘、人类反馈强化学习、鲁棒性、责任归属 摘要&#xff1a;当我们把AI从“只会做一件事的工具人”升…...

微生物网络分析终极指南:NetCoMi如何帮你3步构建复杂关联网络

微生物网络分析终极指南&#xff1a;NetCoMi如何帮你3步构建复杂关联网络 【免费下载链接】NetCoMi Network construction, analysis, and comparison for microbial compositional data 项目地址: https://gitcode.com/gh_mirrors/ne/NetCoMi 想揭开微生物群落中隐藏的…...

《Sysinternals实战指南》进程和诊断工具学习笔记(8.15):实战案例|内存狂涨 / 句柄泄漏怎么查?用 VMMap + Handle + ListDLLs 三步定位

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

UVM寄存器模型简化实践:提升芯片验证效率的封装与自动化方案

1. 项目概述&#xff1a;为什么我们需要简化UVM寄存器模型&#xff1f;如果你在芯片验证领域摸爬滚打过几年&#xff0c;尤其是深度参与过SoC或复杂IP的验证&#xff0c;那么对UVM寄存器模型&#xff08;UVM Register Model&#xff09;一定是又爱又恨。爱的是&#xff0c;它提…...

嵌入式PID温度控制:从算法原理到C语言工程实现

1. 项目概述与核心思路最近在做一个智能热水器的嵌入式控制项目&#xff0c;核心任务就是让水温能又快又稳地达到我们设定的目标值。这听起来简单&#xff0c;但实际做起来&#xff0c;水温系统有惯性、有延迟&#xff0c;加热功率和环境散热也在实时变化&#xff0c;想实现精准…...

整合Taotoken多模型能力为智能客服场景提供备选方案

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 整合Taotoken多模型能力为智能客服场景提供备选方案 在构建智能客服系统的过程中&#xff0c;产品经理和工程师常常面临一个核心挑…...

告别龟速下载!保姆级教程:用百度网盘离线下载搞定Android 1.6到16全版本AOSP源码

突破AOSP源码下载瓶颈&#xff1a;高效获取Android全版本开发资源的实战指南 每次打开终端准备下载AOSP源码时&#xff0c;看着缓慢增长的进度条和频繁中断的连接&#xff0c;你是否感到无比沮丧&#xff1f;作为Android开发者&#xff0c;获取完整源码是深入理解系统架构的第一…...

哪家网卡公司靠谱必看5大关键清单 企业采购专属版

选网卡公司的3个常见决策误区很多企业采购网卡时踩坑&#xff0c;往往是陷入了三个常见的决策误区。第一个误区是唯价格论&#xff0c;过度压低采购预算&#xff0c;优先选择报价较低的供应商&#xff0c;忽略了产品的授权资质和正品保障&#xff0c;后续容易买到翻新、贴牌的不…...