Co jsem měl se vrátit v kotlin Tok první funkce?

0

Otázka

Já používám first funkce z kotlin toku. Důvod, proč jsem pomocí tohoto first funkce je, že nemusím sbírat po prvním. Jestli se nevrátím žádnou logickou hodnotu, to dělá červené zdůraznit, že musím vrátit logickou hodnotu. Co bych měl vrátit? Tam nejsou žádný problém, když jsem se jen vrátit pravda, ale já chci vědět, co to znamená.

    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 Kód.

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

Nejlepší odpověď

2

Toto přetížení Flow.first() se používá, aby se první hodnotu průtoku, která odpovídá daným predikátem. To je důvod, proč lambda očekává, že se vrátí boolean na konci. Pro každou hodnotu lambda vrací true, bude vrácena hodnota, a průtok bude zrušena.

Pokud budete potřebovat pouze první hodnota, měli byste další přetížení, které nepřijímá predikátu lambda.

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

Btw nemyslím si, že buffer je nutné. Vy můžete odstranit.

2021-11-24 06:26:16

Děkuji, Mohl byste vysvětlit, proč vyrovnávací paměti není nutné?
Lee WonJoong

Můžete se podívat na jeho dokumentaci. Ve vašem případě jste jen péče o první hodnota vyzařovaného toku, takže nemusíte vyrovnávací paměti nic.
Arpit Shukla

Chápu. Jak jsem potřebovat pouze první hodnota, nepotřebuju vyrovnávací paměti. Děkuji!!!
Lee WonJoong

V jiných jazycích

Tato stránka je v jiných jazycích

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