Kotlin

首页 标签 Kotlin
# Kotlin #
关注
2984内容
|
13天前
| |
第083篇 作用域函数五兄弟:let、run、with、apply、also
Kotlin五大作用域函数(`let`/`run`/`with`/`apply`/`also`)本质由两个维度决定:**对象传入方式**(参数`it` vs 接收者`this`)和**返回值类型**(原对象 vs lambda结果)。理解定义即可推导行为,无需死记硬背。`apply`适合配置,`also`专用于链式副作用,`let`/`run`用于变换,`with`是非扩展函数,语义等价`run`。所有函数均为`inline`,需注意`return`语义。
|
13天前
| |
第082篇 reified 泛型:擦除限制的破局者
`reified` 依赖 `inline` 的根本原因是 JVM 泛型擦除——运行期无法获取 `T` 的类型信息。`reified` 并非“恢复”泛型,而是在编译期借助内联,将调用点的实际类型(如 `String`)直接代入函数体,使 `x is T`、`T::class.java` 等操作合法。它仅适用于编译期已知类型,不支持运行时动态类型,且会增加代码体积。工程中应优先使用 AndroidX 官方显式类型 API,必要时提供 `Class<T>` 重载以兼顾灵活性与兼容性。
|
13天前
| |
第080篇 Lambda 语法精讲:it、尾随 lambda 与隐式接收者
Kotlin Lambda面试核心在四个易错点:尾随vs括号传参(仅限最后一个参数)、单参隐式`it`与嵌套遮蔽、`return`非局部返回(仅inline函数允许)、块式Lambda返回类型由末行推断。具名参数+inline标注+显式label是避坑关键。
|
13天前
| |
第079篇 高阶函数:函数作为参数与返回值
本文深入解析Android开发中的高阶函数,直击面试痛点:从概念(函数作参数/返回值)到本质(控制反转与流程复用),再到工程落地(生命周期回调、异步回调、DSL作用域函数)。详解性能坑(非inline导致对象分配)、设计误(过度抽象)、内存漏(Lambda捕获this),并给出可落地的修复方案与选型判据。
|
13天前
| |
第068篇 sealed class:状态建模的利器
`sealed class` 是 Kotlin 状态建模的核心工具,本质是“用类型系统表达封闭状态机”。它强制子类同文件/模块定义,使编译器可穷举所有分支,配合 `when` 实现**无 `else` 的完备匹配与类型安全**,彻底杜绝非法状态(如 `loading && data != null`),远超枚举与多字段布尔组合的表达力。
|
13天前
| |
第057篇 设计模式入门:单例、工厂、观察者的 Android 落地
设计模式本质是应对“变化”的解法:封装可变点,降低耦合。Android中,它源于真实痛点——如创建分散、行为需替换、状态需通知等。关键不在背23种名称,而在识别“哪处会因需求变更而反复修改”。单例防多实例、工厂解耦创建、策略隔离算法、观察者实现松耦合通信。用错的根源往往是“为模式而模式”,而非解决真实变化。
|
13天前
| |
第067篇 data class:一行顶 Java 一百行
Kotlin `data class` 高频却易出事故:编译器自动生成 `equals`/`hashCode`/`copy` 等方法,但行为隐式、易踩坑——数组字段引用比较致去重失效、`equals`/`hashCode` 不配套致 `HashMap` 查不到、`copy` 浅拷贝引发数据污染、解构依赖参数顺序、序列化需 `@JvmField`。核心原则:字段须不可变、集合用只读类型、契约必须守恒。
|
13天前
| |
第063篇 类型推断与基本类型:Kotlin 没有隐式拓宽
Kotlin 用“可空性”统一基本/包装类型:`Int`编译为JVM基本类型,`Int?`才装箱为`Integer`;`==`恒为值比较,算术不隐式提升,需显式`toLong()`等转换;泛型容器仍会装箱。核心是分清语言抽象与JVM现实。
|
13天前
| |
第066篇 lateinit 与 by lazy:延迟初始化的适用边界
`lateinit` 与 `by lazy` 均解决延迟初始化问题,但机制迥异:`lateinit` 是编译期修饰符,仅适用于非基本类型的 `var`,未赋值访问抛异常;`by lazy` 是线程安全的委托,支持所有类型,首次访问才执行初始化。二者适用场景不同,优先考虑 DI、View Binding 等更安全方案。
|
13天前
| |
第078篇 Sequence 与惰性求值:大数据量集合优化
`Sequence` 的核心是**惰性求值**(操作延迟至终端才执行)与**冷流语义**(每次遍历都重新计算,不缓存)。它省内存(无中间集合),但不支持多次遍历、随机访问;适用于大集合多级过滤或无限序列截断(如 `take`)。慎用于副作用操作、未截断的无限流及需重复消费场景——应物化(`toList()`)或内联使用。
免费试用