我应该 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
}

顺便说一句,我认为不需要缓冲区。你可以删除它。