从Kotlin中return@forEach了个寂寞

news/2024/10/31 1:29:31/

9004a6ed0bb4518720c9b8124841ee19.png

点击上方蓝字关注我,知识会给你力量

9bda1d781ada0fde0158f72c2a6e2091.png

今天在Review(copy)同事代码的时候,发现了一个问题,想到很久之前,自己也遇到过这个问题,那么就来看下吧。首先,我们抽取最小复现代码。

(1..7).forEach {if (it == 3) {return@forEach}Log.d("xys", "Num: $it")
}

很简单的代码,我相信很多人都这样写过,实际上就是遍历的过程中,满足条件后就退出遍历,那么上面的代码,能实现这样的需求吗?我们来看下执行结果。

Num: 1
Num: 2
Num: 4
Num: 5
Num: 6
Num: 7

很遗憾,即使等于3之后就return了,但是然并卵,遍历依然继续执行了。相信很多写Kotlin的开发者都遇到过这个问题,其原因,还是在于语法的思维定势,我们在Kotlin的文档上,可以找到非常明确的解释。
https://kotlinlang.org/docs/returns.html

我们先来看下Kotlin中forEach的源码。

/**
* Performs the given [action] on each element.
*/
@kotlin.internal.HidesMembers
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {for (element in this) action(element)
}

我们来提取下关键信息:

  • 内联函数

  • 高阶函数

发现了吗,由于高阶函数的存在,当你在高阶函数的闭包内「return」时,是结束的整个函数,当你使用「return@forEach�」时,是结束当前的闭包,所以,如果你像这样写:

(1..7).forEach {if (it == 3) {return}Log.d("xys", "Num: $it")
}

那么等于3之后,整个函数就被return了,那么如果你像文章开头这样写,那么等效于continue,因为你结束了当前的闭包,而这个闭包只是其中的一次遍历过程。那么我们要如何实现我们最初的需求呢?看到这样,答案其实已经呼之欲出了,那就是要return整个遍历的闭包。所以,官方也给出了解决方案,那就是外面套一层闭包:

run loop@{(1..7).forEach {if (it == 3) {return@loop}Log.d("xys", "Num: $it")}
}

写起来确实是麻烦一点,但这却是必不可少的过程,是引入闭包所带来的一点副作用。

当然这里不仅限于run,任何闭包都是可以的。

向大家推荐下我的网站 https://www.yuque.com/xuyisheng  点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

往期推荐

  • FlutterComponent最佳实践之Widget Lifecycle

  • FlutterComponent最佳实践之国际化

  • 从源码看Flutter BuildContext的秘密

  • FlutterComponent最佳实践之Widget尺寸

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载。

< END >

作者:徐宜生

更文不易,点个“三连”支持一下👇


http://www.ppmy.cn/news/359606.html

相关文章

钓鱼网站新花招 福彩赌球成噱头

因为博彩活动越来越引人注目&#xff0c;一些钓鱼网站的制作者&#xff0c;又将博彩当成了一种引人耳目的心噱头&#xff0c;实施网络诈骗。甚至一些不法网站竟然公开制作并销售钓鱼网站模版&#xff0c;对网络安全造成了巨大的危害。 博彩成为一种新的娱乐方式&#xff0c;当然…

全球及中国高纯二氧化硅行业趋势分析及投资调研评估报告2022年版

全球及中国高纯二氧化硅行业趋势分析及投资调研评估报告2022年版 【报告编号】: 414674 【出版时间】: 2022年3月 【出版单位】: 中商经济研究网 1 高纯二氧化硅市场概述 1.1 高纯二氧化硅行业概述及统计范围 1.2 按照不同产品类型&#xff0c;高纯二氧化硅主要可以分为…

转载:一个老IT人的自白:看十年硬件品牌兴亡史

一个老IT人的自白&#xff1a;看十年硬件品牌兴亡史 1 华硕   我用的第一台电脑就是华硕&#xff0c;型号是P5什么的&#xff0c;忘记了&#xff0c;配P133的CPU,这台机器现在仍在当一个打字机服役&#xff0c;十年来死机0次。这就是磐石的根基所在&#xff0c;像一颗百年老树…

近十年硬件品牌兴亡史,一个老IT人的自白

1 华硕 我用的第一台电脑就是华硕&#xff0c;型号是P5什么的&#xff0c;忘记了&#xff0c;配P133的CPU,这台机器现在仍在当一个打字机服役&#xff0c;十年来死机0次。这就是磐石的根基所在&#xff0c;像一颗百年老树&#xff0c;表面上看起来枝繁叶茂&#xff0c;一派繁荣…

一个老IT人的自白:看十年硬件品牌兴亡史

一个老IT人的自白&#xff1a;看十年硬件品牌兴亡史 [转] 原文出自→ IT168 DIY烧友会 http://diybbs.it168.com 本贴地址: http://diybbs.it168.com/viewthread.php?tid54566 1 华硕 我用的第一台电脑就是华硕&#xff0c;型号是P5什么的&#xff0c;忘记了&#xff0c;配P13…

一个老IT人的自白

1、华硕 我用的第一台电脑就是华硕&#xff0c;型号是P5什么的&#xff0c;忘记了&#xff0c;配P133的CPU,这台机器现在仍在当一个打字机服役&#xff0c;十年来死机0次。这就是磐石的根基所在&#xff0c;像一颗百年老树&#xff0c;表面上看起来枝繁叶茂&#xff0c;一派繁…

Windows系统配置Python环境(Anaconda篇)

Windows系统配置Python环境&#xff08;Anaconda篇&#xff09; 一、下载 根据自己电脑系统下载对应的安装包 官方下载地址&#xff1a;https://www.anaconda.com/products/distribution 清华镜像网站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ …

【Python】Python进阶系列教程--Python AI 绘画(二十)

文章目录 前言Windows 环境安装Civitai 介绍 前言 往期回顾&#xff1a; Python进阶系列教程-- Python3 正则表达式&#xff08;一&#xff09;Python进阶系列教程-- Python3 CGI编程&#xff08;二&#xff09;Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动&a…