Kotlin Akışının ilk işlevinde geri dönmek için neye ihtiyacım var?

0

Soru

Kullanıyorum first kotlin akışından işlev. Bunu kullanmamın nedeni first işlev, ilk seferden sonra toplamak zorunda olmamam. Herhangi bir boole değeri döndürmezsem, bir boole değeri döndürmem gerektiğinin altını çizer. Neyi iade etmeliyim? Doğru döndüğümde sorun yok ama ne anlama geldiğini bilmek istiyorum.

    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

En iyi cevabı

2

Bu aşırı yük Flow.first() verilen yüklemle eşleşen akışın ilk değerini almak için kullanılır. Bu yüzden lambda sonunda bir boole döndürmenizi bekliyor. Lambda true değerini döndürürse, bu değer döndürülür ve akış iptal edilir.

Yalnızca ilk değere ihtiyacınız varsa, lambda yüklemini kabul etmeyen başka bir aşırı yükleme yapmanız gerekir.

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

Bu arada, tamponun gerekli olduğunu sanmıyorum. Bunu kaldırabilirsin.

2021-11-24 06:26:16

Teşekkürler, tamponun neden gerekli olmadığını açıklayabilir misiniz?
Lee WonJoong

Belgelerine bir göz atabilirsiniz. Sizin durumunuzda tek akış yaydığı çok şey tampon gerek yok ilk Değer Değer veriyorsun.
Arpit Shukla

Oh anlıyorum. Yalnızca ilk değere ihtiyacım olduğu için arabelleğe ihtiyacım yok. Teşekkürler!
Lee WonJoong

Diğer dillerde

Bu sayfa diğer dillerde

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