Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

377
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!