我应该 return 在 kotlin Flow 第一个函数中做什么?
What should I have to return at kotlin Flow first function?
我正在使用来自 kotlin 流的 first
函数。我之所以用这个first
的功能是因为第一次以后不用再收了。
如果我没有 return 任何布尔值,它会用红色下划线表示我必须 return 一个布尔值。我应该return做什么?当我只是return true 时没有任何问题,但我想知道它是什么意思。
private fun getGroupNameData() {
viewModelScope.launch {
repository.loadGroupsWithFlow()
.buffer()
.first { newList ->
groupData.clear()
newList.forEach { newGroupData ->
groupData[newGroupData.id] = newGroupData.name
}
true // <- what is this boolean value?
}
}
}
first
代码.
/**
* The terminal operator that returns the first element emitted by the flow matching the given [predicate] and then cancels flow's collection.
* Throws [NoSuchElementException] if the flow has not contained elements matching the [predicate].
*/
public suspend fun <T> Flow<T>.first(predicate: suspend (T) -> Boolean): T {
var result: Any? = NULL
collectWhile {
if (predicate(it)) {
result = it
false
} else {
true
}
}
if (result === NULL) throw NoSuchElementException("Expected at least one element matching the predicate $predicate")
return result as T
}
Flow.first()
的重载用于获取与给定谓词匹配的流的第一个值。这就是为什么 lambda 希望你在最后 return 一个布尔值。对于 lambda return 为真的哪个值,该值将被 returned 并且流将被取消。
如果您只需要第一个值,您应该使用不接受谓词 lambda 的另一个重载。
val newList = repository.loadGroupsWithFlow().buffer().first() // Use this first()
groupData.clear()
newList.forEach { newGroupData ->
groupData[newGroupData.id] = newGroupData.name
}
顺便说一句,我认为不需要缓冲区。你可以删除它。
我正在使用来自 kotlin 流的 first
函数。我之所以用这个first
的功能是因为第一次以后不用再收了。
如果我没有 return 任何布尔值,它会用红色下划线表示我必须 return 一个布尔值。我应该return做什么?当我只是return true 时没有任何问题,但我想知道它是什么意思。
private fun getGroupNameData() {
viewModelScope.launch {
repository.loadGroupsWithFlow()
.buffer()
.first { newList ->
groupData.clear()
newList.forEach { newGroupData ->
groupData[newGroupData.id] = newGroupData.name
}
true // <- what is this boolean value?
}
}
}
first
代码.
/**
* The terminal operator that returns the first element emitted by the flow matching the given [predicate] and then cancels flow's collection.
* Throws [NoSuchElementException] if the flow has not contained elements matching the [predicate].
*/
public suspend fun <T> Flow<T>.first(predicate: suspend (T) -> Boolean): T {
var result: Any? = NULL
collectWhile {
if (predicate(it)) {
result = it
false
} else {
true
}
}
if (result === NULL) throw NoSuchElementException("Expected at least one element matching the predicate $predicate")
return result as T
}
Flow.first()
的重载用于获取与给定谓词匹配的流的第一个值。这就是为什么 lambda 希望你在最后 return 一个布尔值。对于 lambda return 为真的哪个值,该值将被 returned 并且流将被取消。
如果您只需要第一个值,您应该使用不接受谓词 lambda 的另一个重载。
val newList = repository.loadGroupsWithFlow().buffer().first() // Use this first()
groupData.clear()
newList.forEach { newGroupData ->
groupData[newGroupData.id] = newGroupData.name
}
顺便说一句,我认为不需要缓冲区。你可以删除它。