Co powinienem zwrócić w pierwszej funkcji przepływu kotlin?

0

Pytanie

Używam first funkcja z przepływu kotlina. Powodem, dla którego używam to first funkcja w tym, że nie muszę zbierać pieniądze po raz pierwszy. Jeśli ja nie zwracam żadnego logicznego znaczenia, to sprawia, że czerwone podkreślenie tego, że muszę zwrócić wartość logiczną. Co powinienem zwrócić? Nie ma problemu, gdy tylko zwracam prawdę, ale chcę wiedzieć, co to znaczy.

    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 Kod.

/**
 * 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

Najlepsza odpowiedź

2

Ta przeciążenie Flow.first() używany jest do produkcji pierwszej wartości przepływu, odpowiedniej do danego предикату. Dlatego lambda spodziewa się, że w końcu sprowadzi wartość logiczną. Dla każdej wartości, która lambda zwraca true, to wartość zwracana, i strumień zostanie anulowane.

Jeśli potrzebujesz tylko pierwszą wartość, należy użyć innego przeciążenie, która nie akceptuje lambda-orzecznik.

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

Nawiasem mówiąc, nie sądzę, że bufor jest konieczny. Można usuń to.

2021-11-24 06:26:16

Dziękuję, nie można wyjaśnić, dlaczego bufor nie jest wymagane?
Lee WonJoong

Można zapoznać się z jego dokumentacją. W twoim przypadku ciebie interesuje tylko pierwsza wartość emitowanego przez strumień, więc nie trzeba nic буферизировать.
Arpit Shukla

O, rozumiem. Ponieważ muszę tylko pierwszą wartość, mi nie jest potrzebny bufor. Dziękuję!
Lee WonJoong

W innych językach

Ta strona jest w innych językach

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