
Kotlin
文章平均质量分 84
Kotlin语言使用介绍
_小马快跑_
代码说,欢迎点赞、关注。感谢!
展开
-
Kotlin | Inner内部类 vs 嵌套类(静态内部类)
inner关键字用于声明一个内部类,它持有对外部类的引用,能够访问外部类的属性和方法。内部类在需要与外部类进行交互时非常有用。原创 2024-09-13 20:57:14 · 750 阅读 · 0 评论 -
Kotlin | 协程async、await机制实现串行&并行请求
await: 是用于等待异步任务完成并获取结果的函数。只能用于等待异步任务返回数据。 函数会挂起当前协程,直到对应的异步任务完成,并返回任务的结果。使用示例示例1:使用 async 和 await 实现并发任务在这个示例中,我们定义了两个挂起函数 和 ,分别模拟了两个网络请求。然后,我们使用 启动了两个异步任务,并通过 函数等待任务完成并获取结果。最后,打印出两个任务的结果。通过日志可以看到两个任务是并发执行的。如果想实现两个任务串行执行呢?比如第二个任务需要等第一个任务执行完才能启动,只需原创 2024-05-14 23:43:23 · 1873 阅读 · 0 评论 -
Kotlin | 利用扩展函数巧妙转换对象
一个顶级扩展函数,负责将A实例中的变量值赋给对应的B中,后续有修改可以统一在这里处理;另外顶级函数也意味着可以在任意有需要的地方调用它,比如上述示例的1、 2处都可以调用这个扩展函数,从而达到复用的目的。其中A是从服务端获取数据后生成的,而UI界面层使用的是B。文章列举了一些比较实用的扩展函数,本文中也是扩展函数的一种使用,同样也是一种不错的选择。不得不说这种写法给人眼前一亮的感觉。原创 2023-10-31 00:52:50 · 224 阅读 · 0 评论 -
Kotlin中使用Java数据类时引发的一个Bug
如果我们使用 Kotlin 语言编写 Model 类就不会有这个问题,因为 Kotlin 编译器自动帮我们重写了。开始我以为是数据变了,但是通过Log打点发现前后数据也是一样的,那么明明是一样的,为什么对比会是不同呢?看上去一切都是OK的,但是运行之后发现出问题了,即使前后数据完全一样,仍然会进行。可以看到 Kotlin 编写的 Model 类自动帮我们实现了其中的。数据类没有写出来,因为项目中是。上述逻辑写的差不多了,还差。版的 AS 中,可以使用。前后数据是一样的,那么。里的数据对比返回的是。原创 2023-09-22 19:58:13 · 453 阅读 · 0 评论 -
Kotlin | 在for、forEach循环中正确的使用break、continue
action闭包作为参数传入的,所以在forEach中return@forEach只能停止当前闭包的逻辑,后面的循环并不会受影响,会继续后面的循环。那么如何在forEach中模拟break的效果呢?那么如何在forEach中分别模拟出break、continue的效果呢?相当于表达式里面的continue了。为什么不是break的效果呢?return 只会从 lambda 表达式中返回。,而这里是forEach的闭包,所以并不能直接使用。嗯,跟Java中的使用姿势是一样的,继续往下看。原创 2023-09-18 23:54:18 · 2511 阅读 · 0 评论 -
提高开发效率!5个对开发者有用的Kotlin扩展函数
通过使用扩展函数,我们可以轻松地为现有代码库添加新功能和增强功能。下面就列举几个有用的扩展函数。原创 2023-07-14 18:19:25 · 801 阅读 · 0 评论 -
Kotlin | 利用by委托机制封装SharedPreference
Kotlin中的委托机制是一种非常灵活的语言特性,它可以让我们将对象的某些属性或方法委托给其他对象来处理。常见的有类委托属性委托Kotlin | 10分钟搞定by委托机制。注:本文不再详细讲解委托机制是什么,如果还不了解什么是委托机制,可以点击上文中的链接学习。原创 2023-07-12 11:48:03 · 230 阅读 · 0 评论 -
Kotlin | 10分钟搞定by委托机制
委托机制是一种非常灵活的语言特性,它可以让我们将`对象的某些属性或方法`委托给`其他对象`来处理。原创 2023-06-05 15:17:49 · 978 阅读 · 0 评论 -
Kotlin | 高阶函数reduce()、fold()详解
reduce()适用于不需要初始值的聚合操作,fold()适用于需要初始值的聚合操作。reduce()操作可以直接返回聚合后的结果,而fold()操作需要通过lambda表达式的返回值来更新累加器的值。在使用时,需要根据具体场景来选择使用哪个函数。原创 2023-04-21 00:31:15 · 2115 阅读 · 0 评论 -
Kotlin | Flow数据流的几种使用场景
如果最终展示依赖多个接口且接口之间是有依赖关系的,之前我们可能会在第一个接口请求成功的回调里继续调用第二个接口,以此类推,这样虽然能实现,但是会导致回调层级很深,也就是所谓的回调地狱;一般在处理复杂逻辑、耗时操作时,我们会将其放到子线程中去处理,避免在主线程中处理导致卡顿。可以看到不但得到了所有接口的数据,而且总耗时基本等于耗时最长的接口的时间,说明。更优的方式是采用接口并行,可以使用。可以方便地进行线程切换,所以处理复杂逻辑、耗时操作时,可以考虑使用。的作用域是在自身之上的操作,上述例子中。原创 2023-03-15 00:59:32 · 1949 阅读 · 0 评论 -
Kotlin Flow | SharedFlow和StateFlow详解
两者之间的区别很简单,冷流只有在有订阅者的情况下才会发出事件,而热流即使没有任何订阅者对其订阅,也可以发出新的事件。例如,在你使用RxJava的PublishSubject的地方,你可以使用SharedFlow。换句话说,尽管这个框架是有效的,但它很容易被它的所有功能所迷惑。因此,调用者没有权力改变SharedFlow的内容,这是一个强大的设计和职责分离的巧妙方法,避免了突变性错误。原因是因为,对value的更新总是混合在一起的,这意味着即使你的更新速度超过了订阅者的消费速度,他们也只能得到最新的值。转载 2023-03-11 23:55:18 · 1755 阅读 · 0 评论 -
类型边界控制:探寻Kotlin泛型的奥秘
可以看到GenericsC中的泛型参数声明为in后,GenericsC实例可以直接赋值给了GenericsC< EnglishBook>,称为GenericsC在Book上是逆变的。如上声明了GenericsC< T>接口,如果其内部只能写入T,可以认为GenericsC实例对象为消费者(消费T)。如上声明了GenericsP< T>接口,如果其内部只能读取并返回T,可以认为GenericsP实例对象为生产者(返回T)。1、T只能用于函数返回中,不能用于参数输入中;原创 2022-12-31 22:31:33 · 650 阅读 · 2 评论 -
Kotlin 使用vararg可变参数
一般在项目开发中,我们经常会在关键节点上埋点,而且埋点中会增加一些额外参数,这些参数通常是。可以看到通过定义可变参数,在调用方可以灵活地传入。原创 2022-11-23 01:03:45 · 5900 阅读 · 0 评论 -
Kotlin data数据类、copy()函数、sealed密封类
可以将密封类对比枚举类:枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。函数,并未改变对象的属性值时,通过实验发现两者的。当需要复制一个对象,并需要改变部分属性值时,重新生成一个新对象,示例中通过结果中不同的。函数中改变了对象中的属性,会通过。中,当传入的是密封类时,不用再写。抽象类,不能直接进行实例化。密封类的典型用法即是在。原创 2022-10-06 00:45:13 · 2138 阅读 · 0 评论 -
Android Jetpack系列之MVI架构
在之前介绍MVVM的文章中,介绍了常用的架构及其对MVVM的封装使用,其中MVVMRepository提供数据,ViewModel中发送数据,UI层使用的LiveData订阅数据,当有数据变化时会主动通知UI层进行刷新。有兴趣的可以去看一下:1、Android Jetpack系列之MVVM使用及封装2、Android Jetpack系列之MVVM使用及封装(续)那么MVI又是什么呢?看了一些关于MVI的文章,大家都称MVI是(Model-View-Intent),其中Intent称为意图(注意这里的。原创 2022-10-03 22:06:29 · 3454 阅读 · 1 评论 -
Kotlin之@JvmOverloads、@JvmStatic、@JvmField、@JvmInline等注解使用总结
Kotlin代码可以经过编译器转换成VM虚拟机能识别的字节码,所以Java与Kotlin可以互相进行调用。而由于Java与Kotlin语言特性的差异,当Java调用Kotlin代码时,可以在Kotlin代码中适当增加一些注解,从而更方便的调用Kotlin代码。原创 2022-10-02 09:59:40 · 5013 阅读 · 0 评论 -
Kotlin | 深入理解协程
可以在不引入回调的情况下控制任何代码行的线程池,因此可以将其应用于非常小的函数,例如从数据库中读取数据或执行网络请求。来确保每个函数都是主线程安全的,这意味着,您可以从主线程调用每个函数。注:上面的协程启动方式并不推荐在项目中直接使用,因为生命周期比较长,如果没有主动关闭可能就会产生内存泄漏。,但是最终子协程中的异常还是在顶层的父协程种处理的,如果就想在子协程中处理异常呢?可见异常最终是在子协程中处理的,且虽然子协程中发生了异常,父协程依然能执行完毕。之后的延续,其中类型T代表的是原来函数的返回值类型。原创 2022-09-19 21:43:57 · 3240 阅读 · 0 评论 -
Kotlin中正确的使用Handler
在`Kotlin`中,并不能直接通过`static`关键字来声明静态类,那么如何声明一个静态内部类呢?其实在`Kotlin`中,直接在一个类中声明另一个类,经过`Kotlin`编译器之后自动就是`static`静态内部类了。原创 2022-08-08 14:17:16 · 5633 阅读 · 0 评论 -
Android 基于Kotlin Flow实现一个倒计时功能
Flow数据流可以按顺序发送多个值,一个倒计时功能刚好符合这种场景,本文就尝试使用Flow来实现一个倒计时功能。原创 2022-07-13 18:49:37 · 3985 阅读 · 0 评论 -
Kotlin 作用域函数之let、with、run、also、apply的使用笔记
Kotlin 标准库包含几个函数,它们的唯一目的是在对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为作用域函数。共有以下五种:let、run、with、apply 以及 also。https://www.kotlincn.net/docs/reference/scope-functions.html...原创 2022-05-11 13:05:55 · 1193 阅读 · 0 评论 -
Kotlin常用Collection集合操作整理
文章目录写在前面常用集合ListList转为MapSetMap区间 & 数列Sequence序列Iterable & Sequence执行顺序集合操作Copy集合其他操作写在前面本篇记录了Kotlin常用集合的相关操作,用以熟练使用Kotlin里的相关集合。集合接口与相关函数位于 kotlin.collections 包中。常用集合Kotlin 标准库提供了基本集合类型的实现: Set、List 以及 Map。 一对接口代表每种集合类型:一个 只读 接口,提供访问集合元素的操作。原创 2022-03-03 17:08:15 · 5968 阅读 · 2 评论 -
第一行代码Kotlin学习笔记
文章目录变量和函数变量函数逻辑控制循环语句继承与构造器Lambda编程空指针检查编程语言分为编译型语言和解释型语言,编译型语言特点是将源代码一次性编译成二进制文件,然后直接执行;解释型语言有一个解释器,在运行时将源代码解释成二进制数据再执行,因此解释型语言效率慢一些。Java需要通过解析器解析生成的class文件,所以Java语言也属于解释型语言。Kotlin之所以能和Java 100%兼容,是因为通过kotlin自己的编译器将kotlin文件编译成同样规格的class文件,因此也可以被JVM所识别原创 2021-10-24 22:21:29 · 513 阅读 · 0 评论 -
Kotlin协程浅析
文章目录什么是协程协程的使用创建&启动协程协程调度协程的优势什么是协程协程是一种并发设计模式,可以用来简化异步执行的代码。协程并没有抛弃线程机制自立门户,因为本质上协程在执行异步任务时也是通过线程池实现的,但是协程可以在线程间自由切换,相比于回调,协程更加简单。协程的使用协程最常用在并发的场景下,单线程中使用协程的总执行时间并不会比不用协程少。创建&启动协程函数的挂起与恢复协程是在常规函数的基础上添加了两项操作,可以更优雅地处理耗时任务。在常规函数的invoke(或 call)原创 2021-10-24 17:51:23 · 1908 阅读 · 0 评论 -
Android Kotlin之Flow数据流
文章目录Flow介绍Flow使用举例运算符创建操作符中间操作符尾端操作符功能操作符StateFlowStateFlow vs LiveDataSharedFlow完整代码地址参考Flow介绍Flow是google官方提供的一套基于kotlin协程的响应式编程模型,它与RxJava的使用类似,但相比之下Flow使用起来更简单,另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险。我们知道 协程是轻量级的线程,本质上协程、线程都是服务于并发场景下,其中协原创 2021-10-11 20:31:01 · 15659 阅读 · 2 评论 -
Kotlin内联函数inline、noinline、crossinline
文章目录高阶函数内联函数inlinenoinlinecrossinline总结参考高阶函数首先来看下kotlin里的高阶函数定义:如果一个函数接收另一个函数作为参数,或返回类型是一个函数类型,那么该函数被称为是高阶函数。比如下面的代码:private fun highFuc(name: String, block: (String) -> Unit) { block(name)}其中highFuc是函数名,函数中传入了2个参数,第一个参数为String类型,第二个参数即是函数类型原创 2021-08-26 01:46:02 · 2678 阅读 · 2 评论