Что я должен вернуть в первой функции потока kotlin?

0

Вопрос

Я использую first функция из потока котлина. Причина, по которой я использую это first функция в том, что мне не нужно собирать деньги после первого раза. Если я не возвращаю никакого логического значения, это делает красное подчеркивание того, что я должен вернуть логическое значение. Что я должен вернуть? Нет никаких проблем, когда я просто возвращаю истину, но я хочу знать, что это значит.

    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
}
1

Лучший ответ

2

Эта перегрузка Flow.first() используется для получения первого значения потока, соответствующего данному предикату. Вот почему лямбда ожидает, что в конце вы вернете логическое значение. Для любого значения, которое лямбда возвращает true, это значение будет возвращено, и поток будет отменен.

Если вам нужно только первое значение, вам следует использовать другую перегрузку, которая не принимает лямбда-предикат.

val newList = repository.loadGroupsWithFlow().buffer().first() // Use this first()
groupData.clear()
newList.forEach { newGroupData ->
    groupData[newGroupData.id] = newGroupData.name
}

Кстати, я не думаю, что буфер необходим. Вы можете удалить это.

2021-11-24 06:26:16

Спасибо, не могли бы вы объяснить, почему буфер не требуется?
Lee WonJoong

Вы можете ознакомиться с его документацией. В вашем случае вас интересует только первое значение, излучаемое потоком, поэтому вам не нужно ничего буферизировать.
Arpit Shukla

О, я понимаю. Поскольку мне нужно только первое значение, мне не нужен буфер. Спасибо!
Lee WonJoong

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................