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

126
Vistas
Equivalente funcional de este bucle

Estoy tratando de refactorizar la siguiente función para hacerla más idiomática de Kotlin utilizando funciones modernas de lenguaje funcional:

 fun foobar(): List<Account> { var pageOffset = 0 val accounts: MutableList<Account> = ArrayList() var chunk: List<Account> = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE) while (chunk.isNotEmpty()) { accounts.addAll(chunk) pageOffset += MAX_POLL_SIZE chunk = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE) } return accounts }

Mi primer intento fue reemplazar la lista mutable con buildList, pero todavía no tiene un estilo bastante funcional:

 fun foobar2(): List<Account> { var pageOffset = 0 return buildList { var chunk: List<Account> = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE) while (chunk.isNotEmpty()) { addAll(chunk) pageOffset += MAX_POLL_SIZE chunk = accountsService.getAccounts(pageOffset, MAX_POLL_SIZE) } } }

Idealmente, me gustaría reemplazar todo el ciclo while con algo como accountsService.getAccounts(...).map { ... } pero no puedo descifrar cómo refactorizar un ciclo while que tiene este tipo de "primer fragmento". seguido de una serie de fragmentos adicionales. Se puede hacer?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puedes hacer algo como esto:

 fun foobar(): List<Account> = generateSequence(0) { it + MAX_POLL_SIZE }.map { offset -> accountsService.getAccounts(offset, MAX_POLL_SIZE) }.takeWhile { it.isNotEmpty() }.flatten().toList()

generarSequence generateSequence una secuencia perezosa infinita que comienza con 0 , MAX_POLL_SIZE , MAX_POLL_SIZE * 2 , MAX_POLL_SIZE * 3 , y así sucesivamente. Esta es la secuencia de desplazamientos de página para los que obtiene cuentas. Transformamos cada desplazamiento de página a la lista de cuentas a las que corresponde, usando map . Después de eso, especificamos el final de la secuencia infinita usando takeWhile .

Ahora tenemos una Sequence<List<Account>> , por lo que usamos flatten convierte eso en una Sequence<Account> , que luego se puede convertir trivialmente en List<Account> ,

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