Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin流缺少许多普通函数,如any()、distinct()_Kotlin_Kotlin Coroutines_Project Reactor - Fatal编程技术网

Kotlin流缺少许多普通函数,如any()、distinct()

Kotlin流缺少许多普通函数,如any()、distinct(),kotlin,kotlin-coroutines,project-reactor,Kotlin,Kotlin Coroutines,Project Reactor,我在Kotlin中使用反应式编程,并尝试将流用作通量的等价物(带有挂起函数) 我已经注意到许多琐碎的函数在这里丢失了 Kotin列表,序列号,以及流量 流只有distinctUntilChanged(1 1 2 1->1 2 1),但为什么没有distinctuntic 我错过什么了吗 // distinct flow.toList().distinct() // is working but probably not ideal for performance 我遗漏了什么吗?在不使用任何组

我在Kotlin中使用反应式编程,并尝试将流用作通量的等价物(带有挂起函数)

我已经注意到许多琐碎的函数在这里丢失了

Kotin列表,序列号,以及流量

流只有
distinctUntilChanged
(1 1 2 1->1 2 1),但为什么没有
distinctuntic
我错过什么了吗

// distinct
flow.toList().distinct()
// is working but probably not ideal for performance

我遗漏了什么吗?

在不使用任何组合符的情况下强制编写
distinct
,不会花费很长时间

// distinct
flow.toList().distinct()
// is working but probably not ideal for performance
fun Flow.distinct():Flow=Flow{
val pass=mutableSetOf()
收集{
val isNew=pass.add(它)
如果(是新的)发射(它)
}
}
至于为什么不包括在内,我可以提供一个推测。
Flow
对象通常表示长期运行的数据流,通常与应用程序一样长
distinct
要么停止发射(如果元素数量有限),要么必须保持不断增长的可见值集。我想不出需要这种行为的真实用例。因为自己编写并不难,所以这个函数可能不属于库


在这里,可变集被限制在
中。对于每个新的
collect
调用,将创建一个新的可变集。此流对象是线程安全的。
在另一个答案中,集合是在流之外创建的。**因此它将在多个
collect
ion上共享。如果流中的值相同,则第二个
collect
离子将为空


另一个答案中的
任何
实现都是正确的。
由于它已被删除,我将在这里引用它

suspend fun Flow.any(谓词:(T)->Boolean):Boolean=
转换{if(谓词(it))emit(单位)}.firstOrNull()!=无效的
编写
firstOrNull(谓词)!=空
,但必须转换为
单元
。由于
T
可能为null,我们无法判断返回的
null
是实元素还是谓词,因为没有与
谓词匹配的元素


参考
firstOrNull
的实现,我们可以编写以下命令式版本

suspend fun Flow.any(谓词:(T)->Boolean):Boolean{
var结果=错误
收集时间{
if(谓语(it)){
结果=真
假的
}否则{
真的
}
}
返回结果
}

*我找不到一个能表达这种模式的组合词。我已经为此创造了


**越来越多的计算机科学,这是由流程决定的。

distinct()
在Kotlin流程中花了我7行。它有600行长。“我们的目标是只提供核心运营商,您可以将其用作构建块,自行实施必要的、更棘手的操作”@geogeleung他们在该引文中专门讨论了流程吗?为什么要将它们与序列区别对待?引用自的第3页。为什么不包括
distinct
的推测是不正确的,因为
reduce
存在于同样需要所有值的流中,并且它返回单个值,而不是
flow
。示例:我认为比较包含中间操作和终端操作的价值是没有意义的。此外,我的观点是,
reduce
并不能保存内存中的所有内容(在您的示例中,累加一个整数,它是常量内存)<相反,code>distinct
必须保存内存中看到的每个元素。现实生活中的例子是,我有一个ReactiveMongo存储库,其中包含一些我想获取的数据,然后根据第三方api请求(或其他一些内容)执行一些过滤逻辑,最终得到所有dto.someField distinct结果