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

234
Visualizações
Kotlin foreach en un mapa frente a iterar sobre las claves cuando se usa con rutinas

Estoy confundido acerca de lo que está pasando con el siguiente código. task.yield es un hashmap de a a b, y store.put es una función de suspensión que toma una a y una b. La primera forma de iterar a través del mapa funciona sin problemas, al igual que la segunda. La tercera forma, que me parece la forma más natural de hacer la iteración y fue lo que escribí inicialmente, hace que Kotlin se queje de que las funciones de suspensión solo se pueden llamar dentro de un cuerpo coroutine. Supongo que esto tiene que ver con cómo funciona forEaching en un mapa (¿a diferencia de una lista, tal vez?), Pero realmente no entiendo cuál es el problema.

 launch{ // Kotlin is perfectly happy with this for(elt in task.yield.keys){ store.put(elt,task.yield[elt]!!) } // and this task.yield.keys.forEach { store.put(it,task.yield[it]!!) } // This makes kotlin sad. I'm not sure why task.yield.forEach { t, u -> store.put(t, u) } }

Editar: acabo de darme cuenta de que la lista para cada uno es una función en línea, mientras que el mapa que estoy tratando de usar no lo es. Supongo que este es el problema.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

De hecho, la sobrecarga de Map#forEach que acepta una (K, V) -> Unit (un BiConsumer<? super K, ​? super V> ) no forma parte de las bibliotecas estándar de Kotlin sino del propio JDK ( Map#forEach ). Esto explica por qué cualquier cosa que se ejecute dentro de este bloque no está en línea y, por lo tanto, no forma parte del "contexto de suspensión" adjunto.

Hay una función muy similar que proporciona Kotlin que puede utilizar:

 inline fun <K, V> Map<out K, V>.forEach(action: (Entry<K, V>) -> Unit)

Realiza la acción dada en cada entrada.
kotlin-stdlib / kotlin.colecciones / forEach

Esto acepta una Entry<K, V> , por lo que simplemente puede desestructurarla dentro de la lambda:

 task.yield.forEach { (t, u) /* <-- this */ -> store.put(t, u) }
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