首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

let,run,with,apply及also差异化分析

Kotlin的作用域函数 Kotlin 标准库包含几个函数,它们的唯一目的是在对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域。...因为在Kotlin中,如果let块中的最后一条语句是非赋值语句,则默认情况下它是返回语句。 那如果我们将let块中最后一条语句修改为赋值语句,会发生什么变化?...可以看到我们将Book对象的name值进行了赋值操作,同样对Book对象进行打印,但是最后控制台的输出结果为“kotlin.Unit”,这是因为在let函数块的最后一句是赋值语句,print则将其当做是一个函数来看待...这是let角色设定的第一点:1️⃣ let块中的最后一条语句如果是非赋值语句,则默认情况下它是返回语句,反之,则返回的是一个 Unit类型 我们来看let的第二点:2️⃣ let可用于空安全检查。...另外,第一点:1️⃣ 当 lambda 表达式同时包含对象初始化和返回值的计算时,run更适合。 这句话是什么意思?

60050

35分钟教你学dart(第二节)

RUN 按钮:在编辑器中运行代码。 控制台:位于右上角,显示输出。 文档面板:位于右下角,显示有关代码的信息。 示例:此下拉列表显示了一些示例代码。...您可以使用printDart 中的内置将变量打印到控制台。在变量之后添加该调用: print(myAge); // 35 在 DartPad 中单击RUN以运行代码。...因此,您可以int在打印语句下方分配一个值。...使用final了不具备在编译时已知的,但初始化后不能被重新分配的值。 注意:final就像val在 Kotlin 或letSwift 中一样。...要在函数体内执行代码,请调用变量名,就像它是函数名一样: oonPressed(); // button pressed 按钮按下 您可以使用箭头语法简化函数体仅包含一行的函数。

13.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    安卓软件开发:Jetpack Compose、Material 3和Kotlin协程在Android开发协程App

    应用界面中包含两个按钮:开始/停止和重置,两个用于显示赛跑者进度的进度条。选手 1 和 2 被设置为不同的速度“奔跑”。...比赛状态由 raceInProgress 控制,当状态变更时,界面会响应。 2.5 开发选手状态管理 (1)RaceParticipant 类是每个选手的状态持有者,通过协程更新每个选手的进度。...用于在用户点击“重置”按钮时,重置赛跑状态。...每次暂停时,选手的进度会保持,恢复后继续赛跑,最终验证进度是否按两次跑步的累加结果更新。 3.4.2 测试用例 4 测试结果:选手两次运行后,进度是10(每次运行 5 个增量)。...用了Kotlin的测试框架(Junit)和协程测试库。 六、学习技术笔记 协程:它们就像后台任务的轻量级线程,在不阻塞主界面的情况下进行计算。

    508235

    介绍Kotlin第二部分(翻译篇)

    关于Kotlin和lambdas的最好部分是类型推断,当类型不匹配时,它就在你的代码下面出现一条红色的线。通过编译器的这种帮助,您可以将精力放在业务逻辑上,而不是试图找出循环应该遍历多少遍。...: "James" 当laddy和name都不为空时,才会返回“James”。 3、扩展功能(Apply, Let, Run, and With) Kotlin推出了一些扩展功能,可以帮助我们处理。...使用它来运行某些东西,当且仅当它被调用的对象不是null(使用它类似于let上面的几行,但在run这种情况下this作为范围的对象)或使用它来调用我们的函数调用并保护我们的lambdas。...在Kotlin中类型推断是非常好的,编译器在编写代码时给出了很多有用的提示。当您需要检查对象是否是某种类型时,您可以使用is关键字。...第二个功能修复了:它做了一个简单的is检查,在这一点上,Kotlin智能的将该值转换为Int,因此它可以在if语句中使用。

    98940

    Kotlin入门(6)条件分支的实现

    is_odd } 以上代码的作用是,奇数次点击按钮,界面展示凉风有信的谜底;偶数次点击按钮,界面展示秋月无边的谜底。看似不能再简单的判断语句,谁能料到Kotlin也要加以简化?...+1) % 3 } 从以上代码可以看出when/else与switch/case有以下几点区别: 1、关键字switch被when取代: 2、判断语句“case 常量值:”被“常量值 ->”取代...; 3、每个分支后面的break语句取消了,Kotlin默认一个分支处理完就直接跳出多路语句; 4、关键字default被else取代; 跟优化后的if/else一样,Kotlin中的when/else...现在Kotlin去掉了这个限制,进行分支处理时允许引入变量判断,当然引入具体的运算表达式也是可以的。...,类型判断一样沿用when/else语句,只不过在分支判断时采取“is 变量类型 ->”这种形式。

    93440

    干货|Kotlin入门第一课:从对比Java开始

    String) 上面类的定义在声明属性时,Kotlin采用默认访问修饰符public,而Java是private,如果kotlin也是private,那同样得定义一系列的set()/get(),不然在类外面无法通过对象获取属性...= Artist(1, "Dylan", "http://www.cnblogs.com/tgyf/") Kotlin对象创建不用加new关键字,而且语句后面不用加分号”;”(即使加上也会被忽略)。...toString() 而类名前的data关键字,是显示声明该类是作为数据类使用,通过toString()打印的结果可以看出区别,打印语句: 1 println("artist.toString():...毕竟后者在变量是否null的情况下都能做出相应的处理。我所能想到的需要用”!!”的场景之一是:当一个变量在声明时不能马上初始化,而在真正用到时又必须是非null的。...2.4 lambda表达式 下面以绑定控件,设置按钮点击事件监听,点击后改变文本显示为例。

    1K110

    Kotlin学习日志(二)数据类型

    :变量类型”的格式声明,不同于Java中常见的“变量类型:变量名”这种格式,(PS:这个在刚开始接触Kotlin的时候很容易搞混,用久了就可以了),后面是没有分号的,Java则有,在Kotlin中如果你后面还有其他语句的话则要加上分号...1.2变量转换 Kotlin中进行数据转换和Java中不同,就不一一对比了,直接说Kotlin中如何进行数据类型转换,Kotlin中都是使用类型转换函数来进行数据类型转换的,让我们来认识一下,如下表 Kotlin...代码也比较简单,说明一下,先声明一个字符串数组,在点击按钮的代码中,声明一个String变量,一个Int变量,并初始化,然后使用while循环,判断String数组的长度大于变量 i,当条件不满足时跳出循环...代码中,我们频繁用到了 $ ,美元符号,它在Kotlin中属于特殊字符,因此不能直接打印,需要经过转义后方可打印,转义的方法是使用${’***’}表达式,该表达式外层的“ ${‘’} ”为转义声明,内层的...(2)MutableSet没有修改元素值的方法,一个元素一旦被添加,就不可被修改。

    3.4K20

    树莓派基础实验6:轻触开关按键实验

    一、介绍    按键模块是我们使用最为频繁的一个电子部件,内部有一对轻触拨盘构成,当按下是闭合导通,松开时自动弹开断开。...换句话说,读取的值是未定义的,因为它没有连接到任何东西,直到你按下按钮或开关。它可能会由于接收电源干扰而改变很大的值。   为了解决这个问题,我们使用一个向上拉或向下拉电阻器。...换句话说,等待按钮按下的示例可以改写成: GPIO.wait_for_edge(channel, GPIO.RISING)    注意检测的边缘参数有 GPIO.RISING, GPIO.FALLING...== 1: GPIO.output(Rpin, 0) #红灯灭 GPIO.output(Gpin, 1) #绿灯亮 def Print(x): #打印按键是否按下的提示消息...*****' def detect(chn): Led(GPIO.input(BtnPin)) #控制双色LED灯闪烁 Print(GPIO.input(BtnPin)) #打印按键是否按下的提示消息

    3.1K30

    不要用Java的语法思维来写Kotlin

    val是线程安全的,并且必须在定义时初始化,所以不需要担心 null 的问题。只需要注意 val 在某些情况下也是可变的就行了。...注意:当且仅当左侧为空时,才会对右侧表达式求值。 4).也许可以尝试一下let函数 let函数一般与安全调用操作符一起使用,我们首先介绍安全调用操作 ?. b?....var属性-不适用(因为该变量可随时被修改) 安全(可空)转换-操作符as为避免抛出异常,可用安全转换操作符 as?,在失败时返回null val a: String? = b as?...但是Kotlin中对于for循环语句新增了其他的规则,来满足刚提到的规则。...——最详细的控制语句详解》 9.kotlin stream 真心可以 流式处理给我们的集合操作带来了很大的方便,其实Java 8 一样支持流式处理,我只是想在这里推广一下 stream。

    3K40

    Kotlin---标准扩展函数

    从Kotlin的语言介绍中,可以知道,Kotlin在空指针以及null对象的控制、语句表达上有很多优势,很多优势也来源于Kotlin的扩展函数的支持。...let函数 首先来详细介绍一下let函数的定义,以及它是如何运行的。...InvocationKind.EXACTLY_ONCE) } return block(this) contract代码块:主要为了告诉编译器,Lambda表达式会马上执行,并且只执行一次,因为在编译器编译的时候会对某些变量判空时,...as its receiver and returns its result. */ @kotlin.internal.InlineOnly public inline fun T.run...例如: 在gardenPlantTest函数中,在run代码块中打印完字符串plant,如果plant不为空返回字符串长度,否则返回0,而result中保存的也就是代码块中返回的字符串长度 class

    53320

    《Android编程权威指南》之Android应用的调试篇

    如图,模拟一个崩溃日志: 异常日志 注意,Android应用编译,Kotlin代码会被编译为和Java代码同样的低级字节码,所以即使是用kotlin来编写代码,会看到java.lang异常也不用觉得太奇怪...上述图片显示的异常,我们可以从异常语句直接跳转到源代码出错的对应行上,找出奔溃原因,加以修正。...当然这是比较简单的异常,真正的复杂项目中,碰到运行异常时,记得在LogCat中寻找最后一个异常及其栈跟踪的第一行(对应着源代码),这也是查找解决方案的最佳起点。...demo debug工具控制按钮: debug工具控制按钮 「推荐」一篇专门讲了Android Studio一些各种小技巧的文章,当然包含了调试技巧。...当然不同场景下,打印日志会更加清晰、方便寻找解决问题线索,比如说一个循环中。

    89220

    Kotlin Flow响应式编程,StateFlow和SharedFlow

    可接下来,当我们按下Home键回到桌面后,控制台的日志依然会持续打印。好家伙,这还得了? 这说明,即使我们的程序已经不在前台了,UI更新依然在持续进行当中。...textView.text = it.toString() } } } } } 当点击按钮时...现在运行一下程序,效果如下图所示: 这里需要关注的重点是,当手机发生横竖屏切换时,计数器的数字仍然会保留在屏幕上。 你觉得这很正常?其实则不然。...Toast.LENGTH_SHORT).show() } } } } } } 这里当点击按钮时...现在运行一下程序,效果如下图所示: 可以看到,当点击按钮开始执行登录时,弹出了一个Login Success的Toast,说明登录成功了。到这里都还挺正常的。

    58110

    树莓派基础实验7:倾斜开关实验

    当它向一侧倾斜时,只要倾斜度和力满足条件开关就会通电,从而输出低电平信号。 四、实验步骤 第1步:连接电路,该实验与实验6(轻触开关按键实验)相同。...换句话说,读取的值是未定义的,因为它没有连接到任何东西,直到你按下按钮或开关。它可能会由于接收电源干扰而改变很大的值。   为了解决这个问题,我们使用一个向上拉或向下拉电阻器。...换句话说,等待按钮按下的示例可以改写成: GPIO.wait_for_edge(channel, GPIO.RISING)    注意检测的边缘参数有 GPIO.RISING, GPIO.FALLING...由于存在开关抖动(用示波器可以看到),每次按下开关会调用多次回调函数,这不是我们希望的,有两种方式处理开关抖动:   ①在开关两个引脚之间添加一个0.1uF的电容   ②软件消抖   ③二者结合使用...,信号是高电平,GPIO.input(TiltPin)的值为1,即LED(x)中的x==1,绿灯亮,无打印信息;   当倾斜时,开关通电,从而输出低电平信号,GPIO.input(TiltPin)的值为

    1.2K30

    Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?

    因此,动态版本适合用在强调使用依赖项最新版本的场景,项目会更加积极地拥抱依赖项的最新版本,当仓库中存在依赖项的最新版本时,动态版本直接解析为依赖项的最新版本(还需要满足缓存超时的前提)。...1.3 调整不稳定版本的解析策略 在默认情况下, Gradle 会按照 24 小时缓存有效期缓存动态版本和变化版本的解析结果,在缓存有效期间,Gradle 不会检查远程仓库来获取最新的依赖项。...当一个组件被添加到依赖关系图中时,还会递归地解析该组件所依赖的其他组件,同时将「间接依赖」也添加到依赖关系图中,直到组件自身没有依赖时终止。...你遇到过什么样的依赖冲突问题,可以在评论区发表一下观点 社区中通常会将依赖冲突和依赖版本冲突划上等号,比如 20 年百度 App 技术团队的公开资料 《Gradle 与 Android 构建入门》。...strictly 和 require 语句会相互覆盖,要以最后声明的语句为准,strictly 和 require 语句还会清除之前声明的 reject 语句,因此应该把 reject 语句放在最后。

    74730

    Kotlin鱿鱼游戏大奖赛

    在Kotlin中,函数在if-else块之前被解析,所以.let { print(it) }只适用于最后的else if。所以在这种情况下,第一个if语句的结果将不会被使用,函数将立即返回。...当我们添加两个函数时,我们就有了另一个可以调用的函数。当我们调用它时,我们有一个接一个的lambda表达式被调用。 What am I?...implementing的一个比较让人困扰的地方,所以,我们来分析下Kotlin生成的Java代码。...所以,在使用Kotlin的简化构造函数时,一定要注意属性的覆写。...这对DSL来说是非常好的,可以通过Kotlin完成各种DSL的写法 但是当与默认参数结合在一起时,可能会引起混淆,不要把许多lambda作为参数,如果你仍然这样做,要避免使用默认值 ❝案例来自于Puzzlers

    63120

    Kotlin 学习笔记(一)

    当编译器可以推断出变量的数据类型时,可以不用写冒号和后面的数据类型,例如: var age = 123 // 可推断出 age 为 Int,所以可不写 val name = "Tom...被声明为 open 的 class 是可以被继承的,这里注意下 kotlin 中一个类是默认被修饰为 final 的,即默认的类是不能被继承的。...另外 Kotlin 类是被编译为 KClass 文件,而不是 class 文件。...比如 in 这个关键字,在 Kotlin 中是一个关键字,如果要引用 Java 类中一个叫 in 的对象时,则需要用反引号 ` 解决这个冲突: Utils....Onlyif(true, function) } Kotlin 的 Lambda 会编译为一个匿名内部类,可以使用 inline 关键字来修饰方法,这样当方法在编译时就会拆解方法的调用为语句调用

    64910

    如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器

    当按下运算符时,输入框仍显示第一个数字。当按下第二个数字时,第一个数字被替换。解决方案为了解决这个问题,我们需要使用状态的概念。每次按下按键时,检查状态并确定要采取的操作。起始状态:输入数字。...当按下运算符按钮时:存储运算符,改变状态。当按下另一个数字时:存储数字,清除数字输入,重新开始数字输入。当按下等号按钮时:使用存储的数字和运算符以及数字输入中的当前数字,执行操作。...使用动态语言,例如 Python,可以改变处理按键/按钮按下事件的函数,而不是使用变量和 if 语句来检查状态。...number" # 清空数字列表和运算符列表 self.numbers = [] self.operators = [] def run...self.window.mainloop()if __name__ == "__main__": calculator = Calculator() calculator.run

    13510

    Kotlin系列一:基础知识快速入门

    这样设计,是为了解决Java中final关键字没有被合理使用的问题。 使用指导:永远优先使用val来声明一个变量,而当val没有办法满足你的需求时再使用var。...当一个函数中只有一行代码时,Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间用等号连接即可: fun largerNumber(num1: Int, num2: Int...的语法糖里,当一个函数只有一行代码时,可以省略函数体部分,直接将这一行代码使用等号串连在函数定义的尾部。...,如果是Int型或Double型,就将该类型打印出来,否则就打印不支持该参数的类型。...Kotlin在for循环方面做了很大幅度的修改,Java中最常用的for-i循环在Kotlin中直接被舍弃了,而Java中另一种for-each循环则被Kotlin进行了大幅度的加强,变成了for-in

    82510

    让你迷惑的 Kotlin 代码(4)

    map 函数会逐一变换集合中的元素,其中的打印语句肯定会对所有元素都执行。 可能比较让人纠结的点是,filter 函数中的打印语句,是会对所有元素都执行?还是仅对满足过滤条件的元素执行?...实现方式就是新建一个新集合,再遍历原集合,逐个元素按过滤条件 predicate 判断,符合条件的就加入新集合。 所以前半部分代码中,集合中的每个元素都会被打印,输出 1 2 3 。...所以当集合元素数量巨大的情况下,会存在一定的性能问题。而下半部分代码中的 Sequence 正好解决了这个问题。 懒惰的 Sequence 回顾一下下半部分的代码。...所以,题目中的打印语句自然不会执行。 Sequence.filter() 也是一样,它构建的是一个 FilteringSequence 。这里就不看它的源码了。...当调用 toList() 操作,使用链式操作末端的操作符产生的 Sequence 的迭代器进行迭代时,会递归调用到最上层的第一个 Sequence 的迭代器,而在调用每一个上级迭代器时,同时又会执行自身操作符的对应操作

    36430
    领券