Separar cadena cada n caracteres

¿Cuál sería una forma idiomática de dividir una cadena en cadenas de 2 caracteres cada una?

Ejemplos:

"" -> [""] "ab" -> ["ab"] "abcd" -> ["ab", "cd"] 

Podemos suponer que la cadena tiene una longitud que es un múltiplo de 2.

Podría usar una expresión regular como en esta respuesta de Java, pero esperaba encontrar una mejor manera (es decir, usar uno de los methods adicionales de kotlin).

    Una vez que se libera Kotlin 1.2, puede usar la function chunked que se agrega a kotlin-stdlib mediante la propuesta KEEP-11 . Ejemplo:

     val chunked = myString.chunked(2) 

    Ya puedes probar esto con Kotlin 1.2 M2 prelanzamiento .


    Hasta entonces, puedes implementar lo mismo con este código:

     fun String.chunked(size: Int): List<String> { val nChunks = length / size return (0 until nChunks).map { substring(it * size, (it + 1) * size) } } 

     println("abcdef".chunked(2)) // [ab, cd, ef] 

    Esta implementación descarta el rest que es menor que los elementos de size . Puede modificarlo, agregue el rest al resultado también.

    Una versión funcional de chunked usando generateSequence :

     fun String.split(n: Int) = Pair(this.drop(n), this.take(n)) fun String.chunked(n: Int): Sequence<String> = generateSequence(this.split(n), { when { it.first.isEmpty() -> null else -> it.first.split(n) } }) .map(Pair<*, String>::second) 

    Salida :

     "".chunked(2) => [] "ab".chunked(2) => [ab] "abcd".chunked(2) => [ab, cd] "abc".chunked(2) => [ab, c]