¿Qué debo tener para volver a kotlin Flujo de primera función?

0

Pregunta

Estoy usando first la función de kotlin de flujo. La razón por la que estoy usando este first la función es que no tengo que recoger después de la primera vez. Si no me devuelven ningún valor booleano, que hace de la red subrayar que tengo para devolver un valor booleano. ¿Qué debo regresar? No hay ningún problema cuando yo acabo de volver de verdad, pero quiero saber lo que significa.

    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 Código.

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

Mejor respuesta

2

Esta sobrecarga de Flow.first() se utiliza para obtener el primer valor de flujo que coincide con el dado por el predicado. Es por eso que la expresión lambda que se espera que devuelva un valor booleano en la final. Para cualquier valor de la lambda devuelve true, valor que será devuelto y el flujo será cancelado.

Si usted sólo necesita el primer valor, el otro sobrecarga que no acepta un predicado de la lambda.

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

Por cierto, no creo que buffer es necesario. Usted puede quitar eso.

2021-11-24 06:26:16

Gracias, Podría explicar por qué el buffer no es necesario?
Lee WonJoong

Usted puede tomar un vistazo a su documentación. En el caso de que sólo se preocupan por el primer valor emitido por el flujo por lo que no necesita de búfer de nada.
Arpit Shukla

Oh, entiendo. Como sólo tengo el primer valor, no necesito el búfer. Gracias!
Lee WonJoong

En otros idiomas

Esta página está en otros idiomas

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