Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

378
Vistas
Entendiendo la función de rendimiento de Kotlin

No veo una definición muy clara de la función de yield en Kotlin.

El ejemplo en el enlace de arriba no menciona mucho más que lo siguiente,

 val sequence = sequence { val start = 0 // yielding a single value yield(start) // yielding an iterable yieldAll(1..5 step 2) // yielding an infinite sequence yieldAll(generateSequence(8) { it * 3 }) } println(sequence.take(7).toList()) // [0, 1, 3, 5, 8, 24, 72]

Pero el ejemplo anterior no señala la importancia del rendimiento.

  • ¿Qué significa que es una función suspensiva?
  • ¿En qué escenarios puede ser ventajoso?
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede pensar en yield() como " retorno, y la próxima vez comience desde donde se detuvo ":

 val sequence = sequence { val start = 0 yield(start) // first return yieldAll(1..5 step 2) // if called again, will start from here yieldAll(generateSequence(8) { it * 3 }) // if called more that six times, start from here }

Crea una máquina de estado y esas cosas, pero puede traducirlo a algo como lo siguiente en Java:

 class Seq { private AtomicInteger count = new AtomicInteger(0); private int state = 0; public int nextValue() { if (count.get() == 0) { return state; } else if (count.get() >= 1 && count.get() <= 5) { state += 2; return state; } else { state *= 3; return state; } } }

En la clase Java mantenemos un estado explícito al tener dos variables: count y state . La combinación de sequence y yield permite que este estado se mantenga implícitamente.

Tenga en cuenta que yield() es una función de suspensión, por lo que solo se puede invocar desde otra función de suspend o desde dentro de una rutina.

over 4 years ago · Santiago Trujillo Denunciar

0

Consideremos un ejemplo, donde puede generar el siguiente elemento de la secuencia, pero no ve una manera fácil de implementar un iterador de Java.

 fun fibonacci() = sequence { var a_0 = 1 var a_1 = 1 // this sequence is infinite while(true) { val a_n = a_0 + a_1 a_0 = a_1 a_1 = a_n //this is a suspend function call yield(a_0) } }

El ejemplo usa la función yield para devolver el siguiente elemento de la secuencia. La función es un ejemplo de una función de suspend en Kotlin. La llamada a la función suspende la ejecución del bloque de sequence{..} , por lo que la pila de llamadas está libre.

Digamos que hacemos lo siguiente

 fibonacci().take(10).forEach{ println(it) }

Cada iteración del bucle forEach reanudará el bloque de sequence{..} de la llamada a la función de yield anterior y lo dejará correr a la siguiente llamada a la función de yield . El flujo de ejecución combinará las iteraciones del bucle forEach con la evaluación del bloque de sequence{..} . Puede intentar escribir lo mismo que Java Iterator para sentir lo que hace el compilador de Kotlin detrás de escena.

Las funciones de suspend en Kotlin se realizan de forma minimalista en el lenguaje y en el lado de la biblioteca estándar, el resto se puede implementar en las bibliotecas. Recomiendo consultar la biblioteca kotlinx.coroutines para obtener más detalles, ejemplos y documentación https://github.com/Kotlin/kotlinx.coroutines

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda