Soy un desarrollador de Java que probó Kotlin y encontró un caso contrario a la intuición entre estos dos lenguajes.
Considere el código dado en Kotlin:
"???".split("") # gives ["", "?", "?", "?", ""]y lo mismo en Java:
"???".split("") # gives ["?", "?", "?"]¿Por qué Kotlin produce una cadena de espacios vacíos al principio y al final en la matriz resultante? ¿O Java siempre elimina estas cadenas vacías, y simplemente no estaba al tanto de eso?
Sé que existe el método toCharArray() en cada Kotlin String , pero aún así, no es muy intuitivo (¿tal vez los desarrolladores de Java deberían abandonar los viejos hábitos de Java que esperaban reutilizar en un nuevo idioma?).
Debe filtrar el primer y el último elemento:
"???".split("").drop(1).dropLast(1)Mira este ejemplo:
"".split("") // [, ]Divide esta secuencia de caracteres en una lista de cadenas alrededor de las apariciones de los delimitadores especificados.
Consulte https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/split.html
Esto se debe a que el método Java split(String regex) los elimina explícitamente:
Este método funciona como si invocara el método de división de dos argumentos con la expresión dada y un argumento límite de cero. Por lo tanto, las cadenas vacías finales no se incluyen en la matriz resultante.
split(String regex, int limit) menciona:
Cuando hay una coincidencia de ancho positivo al comienzo de esta cadena, se incluye una subcadena inicial vacía al comienzo de la matriz resultante. Sin embargo, una coincidencia de ancho cero al principio nunca produce una subcadena inicial tan vacía.
"" es una coincidencia de ancho cero. No estoy seguro de por qué considera que toCharArray() no es intuitivo aquí, dividir por una cadena vacía para iterar sobre todos los caracteres es una forma indirecta de hacer las cosas. split() está destinado a la coincidencia de patrones y obtener grupos de cadenas.
PD: Revisé JDK 8, 11 y 17, el comportamiento parece ser consistente desde hace un tiempo.