Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

380
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda