作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Kotlin 中使用响应式(Reactive)编程,并尝试将 Flow 用作等效于 Flux(带有挂起功能)
我注意到那里缺少许多琐碎的功能。
Kotin List、Sequesnce 和 Flux 都有它们
流量只有distinctUntilChanged
( 1 1 1 2 2 1 -> 1 2 1) 但为什么没有 distinct
我错过了什么吗?
// distinct
flow.toList().distinct()
// is working but probably not ideal for performance
我错过了什么吗?
最佳答案
写作 distnct
不使用任何组合器 * 不需要很长时间。
fun <T> Flow<T>.distinct(): Flow<T> = flow {
val past = mutableSetOf<T>()
collect {
val isNew = past.add(it)
if (isNew) emit(it)
}
}
至于为什么不包括在内,我可以提供一个推测。
Flow
对象通常代表长时间运行的数据流,通常与应用程序一样长。
distinct
要么停止发射(如果元素数量是有限的),要么必须保持一组不断增长的可见值。我想不出需要这种行为的现实用例。由于自己编写并不难,因此该函数可能不属于库中。
flow
中。 .对于每一个新
collect
调用,将创建一个新的可变集。这个流对象是线程安全的。
collect
共享。 ionic 。流中的值相同时,第二个
collect
ionic 将是空的。
any
另一个答案中的实现是正确的。
suspend fun <T> Flow<T>.any(predicate: (T) -> Boolean): Boolean =
transform { if (predicate(it)) emit(Unit) }.firstOrNull() != null
写
firstOrNull(predicate) != null
可能很诱人,但转换为
Unit
是必要的。如
T
也许可以为空,我们将无法判断
null
返回的是一个真正的元素或因为没有元素匹配
predicate
.
firstOrNull
的实现,我们可以写出下面的命令式版本。
suspend fun <T> Flow<T>.any(predicate: (T) -> Boolean): Boolean {
var result = false
collectWhile {
if (predicate(it)) {
result = true
false
} else {
true
}
}
return result
}
关于Kotlin Flow 缺少许多琐碎的函数,例如 any()、distinct(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66586852/
我认为这相对简单,但我很困惑,因为我是类图的新手。 我将要创建一个程序(用 Java)来管理麦当劳的员工类型。因此,考虑为对象建模。 为了简单起见,麦当劳只有两种员工,“主管”和“船员”,两者都是按月
我有一个很小的 Android 项目,是我拼凑而成的,用于了解 Android 单元和仪器测试。我使用dog.ceo API 来获取狗的随机图像。程序本身按其应有的方式运行。但是,每当我运行或调试
我是一名优秀的程序员,十分优秀!