上一篇文章我们介绍了作用域函数,并以其中一个作用函数run为例,介绍了作用域函数的使用和原理。...除了run之外,Kotlin 官方还内置了let,apply,also这几个作用域函数,下面我们一起来他们的相同点和区别,并举例说明他们的使用场景。...2. run/let/apply/also 各自的使用场景举例 我们已经知道这 4 个作用域函数的特点了,那么我们怎么用好它们呢?下面一起来看下这几个作用域函数的使用场景。...当 lambda 会用到类的this时,建议使用also。 3. 只有 4 个作用域函数吗?...剩下的几个使用需求没有那么的迫切,但掌握之后,可以帮助你写出更有 Kotlin 味道的代码。 下一篇文章会介绍 Standard.kt 中剩余的作用域函数。
C语言头文件有什么用处 在平时项目开发过程中特别是几个项目组在一起工作的时候,有的时候代码不是完全开放的,这个时候头文件和库的作用就体现出来了,在头文件中可以看到这个模块使用的结构体,以及静态变量或者定义的一些宏...,最主要的看到这个模块使用的函数列表,同时有些关键函数的功能还会在头文件里面做出说明,通常在项目推进过程中就可以通过头文件调用库里面的函数,从而完成单元测试。...就可以使用printf函数打印东西了,有时候发现不带头文件有些系统函数也能被调用起来,主要C语言比较灵活,这种一般在编译的时候会处警告,搞不影响编译通过,C语言的编译通常来讲比较随意,所以在运行过程中可能出现崩溃现象...使用C语言头文件需要注意事项 头文件的里面主要声明一些函数列表,定义一些宏,还会定义一些核心结构体,还会有一些静态全局变量,头文件中尽量不要使用全局变量,因为全局变量在管理上会显得麻烦很多,增加出现问题的概率...当然在实际的开发过程中头文件设置成什么样子还和编程能力水平有一定的关系,在模块设计过程中讲究的高内聚低耦合,在模块内部使用的函数就不要暴露在头文件中,防止外来的操作对模块的数据造成破坏,所以在设计头文件的时候暴露在外部的函数列表是深思熟虑的
因为Alice的年龄没有指定,Elvis运算符使用零代替了它,所以Bob幸运地成了年纪最大的人。 喜欢这样的代码吗 ? 继续读下去,你将会学习到更多,并成为一名Kotlin 专家。...相反,对所 有开发过程中涌现的任务,Kotlin 都提供了全面的生产力提升。它借助支持特定领 域或编程范式的库,提供了卓越的集成水准。...不可变性——使用不可变对象,这保证了它们的状态在其创建之后不能再变化。 无副作用——使用的是纯函数。此类函数在输入相同时会产生同样的结果,并且不会修改其他对象的状态,也不会和外面的世界交互。...没有副作用的函数可以独立地进行测 试,因为不需要写大量的设置代码来构造它们所依赖的整个环境。...当你需要的时候, 可以使用可变数据,也可以编写带副作用的函数,而且不需要跳过任何多余的步骤。然后,毫无疑问的是,在 Kotlin 中使用基于接口和类层次结构的库就像Java 一样简 单。
通过介绍这个列子可以显示出 Kotlin 有助于减少语法噪点,并保持函数小且富有表达力。 无有副作用 致简代码告诉我们应该减少副作用。...我们不应该制造出那些一看到函数名称就感觉意图不明显,发生非期望中的隐藏的变化。但是副作用到底是什么问题呢?...有副作用的代码容易产生错误,很难以理解,很难做测试,不容易并行化运行(非线程安全),不能被缓存并且不能做到延迟加载。我们可以通过函数式编程的概念来避免副作用的产生。...这基本上就意味着编写纯函数(等于无副作用函数)。...空安全实践 让我们假定有一个嵌套域的层级结构:一个订单有一个客户属性,客户拥有一个地址,因此也就有了城市的信息。现在,我们想要深入这个层级获取相应城市信息。这是一个很常见的使用情形。
) 1 -> DiscoverPage () 2 -> HotPage () 3 -> PersonPage () } } 使用记忆的协程作用域可以确保在组件重新合成时...,用于在协程中执行副作用操作。...副作用操作通常包括异步任务、网络请求、数据库操作或其他可能会阻塞主线程的操作。 LaunchedEffect 函数是一个协程构建器,它接受一个或多个参数,并在代码块中执行异步操作。...LaunchedEffect 的参数可以是任何对象,用于标识不同的副作用操作。通常使用简单的数据类对象作为参数,例如 key1 = Unit。...总结起来,LaunchedEffect 是一个用于在协程中执行副作用操作的函数,它确保在 Compose 组件的生命周期内正确处理副作用。
作为一个静态类型语言,Kotlin不是要求每个表达式都应该在编译期具有类型吗?事实上,每个变量和表达式都有返回类型。...实际中的函数通常非常长,可能包含很多返回语句,有显示的返回类型和语句可以帮助你快速的知道什么被返回。...只有有需要的时候,才变为var。***使用不可变引用、不可变对象及无无副作用的函数让你的代码更接近函数式编程风格***。 定义了val变量的代码块执行期间,val变量只能进行唯一一次初始化。...} # 二、类和属性 面向对象编程可能不是什么新鲜话题,Kotlin这方面也似曾相识,但是你会发现许多常见的任务使用更少的代码就可以完成...Kotlin也像Java,有包的概念。每个Kotlin文件在开头有package语句,文件中所有的声明(类、函数和属性)将放在这个包下。
并且在 Kotlin 协程的加持下,Kotlin Flow 目前是 Google 主推的数据流框架。 1. 为什么要使用 Flow?...LiveData、Kotlin Flow 和 RxJava 三者都属于 可观察的数据容器类,观察者模式是它们相同的基本设计模式,那么相对于其他两者,Kotlin Flow 的优势是什么呢?...LiveData 子类 SingleLiveData 或 UnPeekLiveData 解决,此处不展开); LiveData 不防抖: 重复 setValue 相同的值,订阅者会收到多次 onChanged...(或直到 scope 指定的作用域结束)。...因为 addRepeatingJob 不是挂起函数,所以不遵循结构化并发的规则。
这两点,也正是使用协程中所需要注意的。既然不建议直接使用 GlobalScope,我们就先试验一下使用它会是什么效果。...程序代码通常应该使用自定义的协程作用域。直接使用 GlobalScope 的 async 或者 launch 方法是强烈不建议的。...MainScope 官方文档中提到要使用自定义的协程作用域,当然,Kotlin 已经给我们提供了合适的协程作用域 MainScope 。...那么如何在 ViewModel 中定义协程作用域呢?还记得上面 MainScope() 的定义吗?没错,搬过来直接使用就可以了。...引入如下依赖: implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-alpha03" 然后,什么都不需要做,直接使用协程作用域
但是Ceylon具有Java 42之前无法提供的大量功能,我也不希望有独角兽。 我希望有安全调用运算符(还有Elvis运算符,两者稍有不同),也可以用Java实现。...在某个时间点上,人们开始对产生副作用的事物使用语句,而对更具功能性的事物使用表达式。 因此,毫不奇怪,所有的String方法都是真正的表达式,对不可变的字符串进行操作,并始终返回新的字符串。 ...例如,这似乎与Java中的if-else不合适,后者可能包含块和语句,而每个块和语句都可能产生副作用。 但这真的是必要条件吗? 我们也不能用Java编写类似的东西吗? ...毕竟,为什么不呢?...从本质上说,一个函数与其参数类型是互变的,而其结果类型是协变的,那么对Function或Stream的更好定义是: interface Function {} interface
• 无论函数在哪里被调用,或如何被调用,它的词法作用域都只由函数被声明时所处的位置决定。...2.2 欺骗词法 • JavaScript 有两种机制来实现这个目的。 2.2.1 eval(不推荐使用) • JS 中的 eval(...) 函数可接收一个字符串作为参数。...函数接收一个或多个声明的代码,会修改其所处的词法作用域,而 with 声明实际上是根据你传递给它的对象凭空创建一个全新的词法作用域。 • 另外不推荐使用 eval(...)...无论引擎多聪明,试图将这些悲观情况的副作用限制在最小范围内,也无法避免如果没有这些优化,代码会运行得更慢这个事实。 2.3 小结 1. 词法作用域意味着作用域是由书写代码时函数声明的位置来决定。...这两个机制的副作用是引擎无法在编译时对作用域查找进行优化的。所以, 不要使用他们。
Kotlin 的扩展函数 Float.pow() 在 Kotlin 里,我们用的不是 Java 的 Integer、Float、Double,而是另外几个名字相同或相像的 Kotlin 自己新创造的类...扩展函数的写法 扩展函数写在哪都可以,但写的位置不同,作用域就也不同。所谓作用域就是说你能在哪些地方调用到它。...这也和成员函数的作用域很像——哪里能用到这个类,哪里就能用到类里的这个函数: package com.rengwuxian fun String.method1(i: Int) { ... }...那这……和成员函数有什么区别吗?这种奇怪又绕脑子的知识有什么用吗?听我继续讲。...你为什么要把扩展函数写在类的里面?不就是为了让它不要被外界看见造成污染吗,是吧?
---- 异常传播形式 在协程中,异常的传播形式有两种,一种是自动传播( launch 或 actor),一种是向用户暴漏该异常( async 或 produce ),这两种的区别在于,前者的异常传递过程是层层向上传递...结果是不能 为什么? 我不是已经使用了 SupervisorJob() 吗?...---- CoroutinexxHandler 不生效? 下列代码中,添加的 CoroutineExceptionHandler 会生效吗?...提供的作用域从外部作用域继承其coroutineContext ,但用 SupervisorJob 覆盖上下文的 Job 。一旦给定块及其所有子协程完成,此函数就会返回。...也就是初始化scope作用域时使用的 ExceptionHandler)。
今天咱聊一下 Compose 的作用域机制。「作用域」这个词在 Compose 底层原理的角度有它单独的含义,它是用来讨论在界面结构的组合过程中,每个层级之间的关系的一个关键概念。...不过今天,咱不聊这个,我们来借着 Compose 的躯壳,聊一聊 Kotlin 语言这个层面的作用域机制。...但是具体到作用域这个问题,就有一个障碍:就像我刚才说的,它的组件不是用类写的,而是函数。...这样的话,虽然用的是 Kotlin,但我们还是没法像传统布局文件那样对作用域做规则管理。直白点说就是,你想限制某个属性或者函数只能在指定的函数内部被调用,这是做不到的。 但是!实际情况却不是这样。...总结 Compose 是用 Kotlin 写的,它享受了 Kotlin 的便利,但也要承受 Kotlin 的限制。它用 Kotlin 的函数来实现了界面组件,就继承了「函数不具备作用域」的缺陷。
什么是作用域函数(Scope Functions)? Kotlin 标准库包含了几个特殊的函数,其目的是在调用对象的上下文环境(context)中执行代码块。...当你在提供了 lambda 表达式的对象上调用此类函数时,它会形成一个临时作用域。在此作用域内,你可以在不使用其名称的情况下访问该对象,这些函数被称为作用域函数。...在 Kotlin 中,作用域函数总共有五个,分别是:let、run、with、apply、also。接下来我们逐个详细分析。...由于这 5 个作用域函数的性质有些相似,所以大家可能经常不知道在哪种情况下该使用哪个函数,以至于最终放弃使用作用域函数?,所以为了避免类似悲剧发生,我们首先来讨论一下他们之间的区别以及使用场景。...每个作用域函数有两个主要区别: 引用上下文对象的方式 返回值 上下文对象(Context):this 还是 it this run、with 和 apply 通过 this 关键字引用一个 context
作用域函数选择 目前有let、run、with、apply 和 also五个作用域函数。...run { text = "Kotlin" textSize = 14f } 相比较来说使用run显得比较简洁,但let的优势在于可以将it重命名,提高代码的可读性,也可以避免作用域函数嵌套时导致混淆上下文对象的情况...总的来说,这几种函数有许多重叠的部分,因此可以根据开发中的具体情况来使用。以上仅做参考。 Sequence 我们经常会使用到kotlin的集合操作符,比如 map 和 filter 等。...推荐扔物线大佬关于协程的文章,帮你更好的理解kotlin的协程:到底什么是「非阻塞式」挂起?协程真的更轻量级吗?...既然Kotlin中没有这个机制已经是既成事实,那么我们在使用中就需要考虑它带来的影响。比如我们开发中在调用一些方法时,要注意看一下源码中是否有指定异常抛出,然后做相应处理,避免不必要的崩溃。
绕不开的四兄弟 学习 Kotlin 一定绕不开 run/let/apply/also 这四兄弟,它们是 Kotlin 使用频率最高的扩展方法(扩展方法在之前文章有介绍),它们也被称为作用域函数(scope...对于了解到这个额外信息的 Kotlin 编译器,他就可以更有针对性的优化这里的代码(怎么针对,也还没有学到。。)。 4. 为何 Java 没有作用域函数?...作用域函数需要类扩展和内联这两个能力,才能最大化体现其价值。...而没有内联能力的 Java,虽然有 JVM 内联优化支撑,但内联优化只对 final 且调用次数数量级较大的方法有效。如果像 Kotlin 这样规模化的使用作用域函数,对性能是有不可忽视的影响的。...其他作用域函数的使用和适用场景 下一篇! 版权所有,转载请注明出处: https://sickworm.com/?p=1823
不 数据类 开放类 陡峭的学习曲线 ? 名称遮掩 ? 这是 Kotlin 让我感到最大惊喜的地方。看看这个函数: ? 当你调用 inc(1) 的时候会输出什么呢?...在 if 主体中,你可以添加另一个 num,这并不令人震惊(新的块级别作用域)。 好的,在 Kotlin 中,inc(1) 输出 2。但是在Java中,等效代码将无法通过编译。 ?...这个多余的字母到底起什么作用?为什么要把名称和类型分隔开?我不知道。不过我知道这会加大使用Kotlin的难度。 第二个问题。...映射表中的键和值通过 to 运算符关联在一起,这很好,但是为什么不使用大家都熟悉的冒号(:)?真是令人失望! ? Maybe?不 ? 函数式编程语言(比如 Haskell)没有空(null)。...你无法扩展Data类或将其抽象化。所以很可能,你不会在核心领域模型中使用它们。 这个局限性不是Kotlin的错。没有办法在不违反Liskov原则的情况下生成正确的基于值的equals()实现。
函数依赖于 bar 的值,bar 作为一个自由变量被第二个函数引用。 所以说这个函数还依赖于其他的原因吗? 我认为不。...是可靠的纯函数吗!?不。 :( 我们只防范我们可以控制的副作用(通过引用改变)。我们传递的任何带有副作用的函数,都将会污染 simpleList(..)...如果用引用透明定义一个纯函数,读者就不必这样做了。 不够透明? 那么如果一个有副作用的函数,并且这个副作用在程序的其他地方没有被观察到或者依赖会怎么样?这个功能还具有引用透明性吗?...如果副作用可能发生,作者和读者必须尽量应对它们。使它们不发生,作者和读者都要对任何可能或不可能发生的事情更有自信。 纯化 如果你有不纯的函数,且你无法将其重构为纯函数,此时你能做些什么?...封闭的影响 如果副作用的本质是使用词法自由变量,并且您可以选择修改周围的代码,那么您可以使用作用域来封装它们。
Kotlin 函数式编程思想 : FP in Kotlin 函数式编程特性 闭包和高阶函数 函数编程支持函数作为第一类对象,有时称为闭包或者仿函数(functor)对象。...没有"副作用" 所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。...函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。 副作用是修改系统状态的语言结构。...因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。而且,调用函数只会计算出结果 ── 不会出现其他效果。因此,FP 语言没有副作用。...函数式编程好的实践在于对运算过程的高度抽象和没有”副作用”(既保持函数的独立性),函数式编程三板斧是函数式编程的典型范式,在编程中被大量使用,即使人们不关注函数式编程,在使用函数式编程语言的时候,也会不自觉的使用这些函数
由于Kotlin中没有静态成员的概念,因此Kotlin推出了一个有趣的语法糖:对象。那么对象能取代静态类成员吗?该怎么做呢?下面会详细介绍到。...如果将匿名对象用于public函数的返回值,或者public属性的类型,那么Kotlin编译器会将这些函数或属性的返回类型重新定义为匿名对象的夫类型,如果匿名对象没有继承任何类,也没有实现任何接口,那么父类型就是...在Java中,匿名对象访问封闭作用域内的变量,需要用final声明该变量,这也就意味着在匿名对象中无法修改封闭作用域内变量的值。...在Java8中,如果只是使用封闭作用域内的变量,该比那辆无需使用final,但一旦修改变量的值,就必须使用final进行修饰,其实在Java8中,,封闭作用域的变量是一个隐式的final变量。...但是在Kotlin中,在匿名对象中就可以任意访问封闭作用域内的变量,包括修改它的值: fun main(agrs: Array) { var n = 10
领取专属 10元无门槛券
手把手带您无忧上云