Kotlin一些迷惑的语法
和如何写法是一样的,因为编译成java的时候,参数中是带有当前的对象的。疑惑点:为什么传入的方法是无参数的,但是为什么调用的时候传入值?
protected fun sendUiState(copy: S.() -> S) {
_uiStateFlow.update { copy(uiStateFlow.value) }
}
疑惑点:为什么传入的方法是无参数的,但是为什么调用的时候传入值?
这个 copy 函数的签名虽然看起来没有参数,但它的本质是一个 带接收者的函数,它会在一个 S 类型的对象上调用。所以:
copy(uiStateFlow.value)
不是把uiStateFlow.value当作参数传入,而是把它作为接收者对象调用这个 lambda。
和如何写法是一样的,因为编译成java的时候,参数中是带有当前的对象的
protected fun sendUiState(copy: S.() -> S) {
_uiStateFlow.update { uiStateFlow.value.copy() }
}
Iterable
在 Kotlin 中,Iterable 是一个接口,表示可以被迭代的一组元素。它是 Kotlin 集合体系的基础接口之一,类似于 Java 中的 Iterable<T>。
✅ 基本定义:
public interface Iterable<out T> {
operator fun iterator(): Iterator<T>
}
-
T是集合中元素的类型。 -
Iterable的本质是:只要你能for遍历它,它就是 Iterable。
✅ 典型实现:
以下都是 Iterable 的子类型:
-
List -
Set -
Map.keys/Map.values -
自定义只要实现了
iterator()方法的类
✅ 常用操作(来自扩展函数)
Kotlin 给 Iterable<T> 添加了大量实用的扩展函数,比如:
| 操作函数 | 功能 |
|---|---|
forEach {} |
遍历每个元素 |
map {} |
转换为另一个集合 |
filter {} |
条件筛选 |
first {} / find {} |
查找匹配项 |
any {} / all {} |
判断是否满足条件 |
groupBy {} |
分组 |
sortedBy {} |
排序 |
toList() / toSet() |
转换为 List 或 Set |
val list = (0 until 3).map { "转成string" + it }map的一些用法,(0 until 3)也是一个迭代器
在 Kotlin 中,context as? Activity 和 context as Activity 是两种不同的类型转换方式,主要区别在于安全性和失败时的行为:
1. context as Activity (非安全转换)
-
行为:强制类型转换
-
当 context 不是 Activity 时:抛出
ClassCastException导致应用崩溃 -
使用场景:100% 确定 context 是 Activity 的情况(实践中很少见)
-
风险:高,容易导致崩溃
2. context as? Activity (安全转换)
-
行为:尝试类型转换,失败时返回
null -
当 context 不是 Activity 时:返回
null而不是崩溃 -
使用场景:不确定 context 类型时的安全转换
-
风险:低,可通过空安全操作符处理
@get:StringRes
val title: Int
@get:StringRes 是 Kotlin 中的 注解目标(annotation target)语法,表示这个注解是 应用在属性的 getter 方法上,而不是直接应用在字段或 setter 上。
@get:StringRes
val title: Int
等价于在 Java 中写的:
@StringRes public int getTitle() { ... }
reified:
在 Kotlin 中,reified 是和 inline 函数 搭配使用的关键字,允许我们在泛型中 保留类型信息。这是在 Java 或 Kotlin 的普通泛型中做不到的,因为泛型在编译时会被类型擦除(type erasure)
fun <reified T : CommonSheetWeakDialogFragment> show(){
}
这里的 <reified T> 意味着:
-
T是一个泛型类型参数,继承自CommonSheetWeakDialogFragment。 -
使用
reified表示这个类型在运行时是“可见”的(不会被擦除)。 -
你可以在函数体内使用
T::class、T::class.java这样的语法,甚至是直接创建实例(前提是有无参构造函数)。
必须和 inline 配合使用
你实际代码中可能是这样写的:
inline fun <reified T : CommonSheetWeakDialogFragment> show() {
val clazz = T::class.java
// 或者直接创建对象:
val fragment = T::class.java.newInstance()
...
}
更多推荐



所有评论(0)