Función reversed En Kotlin

ANUNCIO
Loading...

En este tutorial verás cómo usar la función reversed en Kotlin con intención de obtener una lista con los elementos invertidos. También verás el uso de la función asReversed() como mecanismo adicional para invertir colecciones.

Función reversed()

La función de extensión reversed() retorna una lista con los elementos en orden invertido de la colección invocadora. Puedes invocarla en varios tipos como arreglos, listas y strings:

// reversed() en arreglos
fun <T> Array<out T>.reversed(): List<T>

// reversed() en colecciones
fun <T> Iterable<T>.reversed(): List<T>

// reversed() en strings
fun String.reversed(): String

Considera una lista que contiene a los nombres de varios filósofos griegos. Si deseamos invertir sus elementos escribimos el siguiente código:

fun main() {
    val greekPhilosophers = mutableListOf(
        "Aristóteles",
        "Platón",
        "Sócrates",
        "Tales de Mileto",
        "Pitágoras")
    val reversedGreekPhilosophers = greekPhilosophers.reversed()
    println(reversedGreekPhilosophers)

    greekPhilosophers[2] = "Gorgias"
    println(reversedGreekPhilosophers) // No se provocan cambios
}

Salida:

[Pitágoras, Tales de Mileto, Sócrates, Platón, Aristóteles]
[Pitágoras, Tales de Mileto, Sócrates, Platón, Aristóteles]

Al invocar reversed() desde greekPhilosophers se creará una nueva lista de tipo List<String>. Al ser una nueva instancia, si se modifica la lista original, reversedGreekPhilosophers no cambiará como se evidencia al modificar el valor de "Sócrates" por "Gorgias".

Función asReversed()

Otra alternativa para invertir el orden de los elementos es la función asReversed(), la cual retorna una vista con relación directa a la lista invocadora. Esto la hace que su rendimiento sea mejor que reversed(), para el caso donde no pienses modificar la lista original.

// asReversed() para listas de solo lectura
fun <T> List<T>.asReversed(): List<T>

// asReversed() para listas mutables
fun <T> MutableList<T>.asReversed(): MutableList<T>

Tomemos como ejemplo la lista mutable de números enteros l = [3, 1, 5, 2, 4] para visualizar fácilmente la funcionalidad de ambas sintaxis. Creemos una lista de solo lectura que sostenga la vista de L a través de un cast.

fun main() {
    val numbers = mutableListOf(3, 1, 5, 2, 4)
    val readOnlyNumbers = numbers as List<Int>
    val reversedNumbersView = readOnlyNumbers.asReversed()

    println("L = $numbers")
    println("I = $reversedNumbersView")

    numbers += 12
    println("\nAgregar ítem")
    println("L = $numbers")
    println("I = $reversedNumbersView")
}

Salida:

L = [3, 1, 5, 2, 4]
I = [4, 2, 5, 1, 3]

Agregar ítem
L = [3, 1, 5, 2, 4, 12]
I = [12, 4, 2, 5, 1, 3]

Como ves, la variable readOnlyNumbers moldea a numbers en un una lista de solo lectura List<Int>. Sobre ella invocamos a asReversed() para obtener la referencia invertida a los números. Y una vez agregamos un ítem, se refleja en la lista invertida el nuevo elemento.

Ahora bien, asReversed() invocada desde una lista mutable genera a su vez una vista mutable. Por lo que el cambio en ambas tendrá efecto en su contraparte. Usemos como ejemplo la siguiente lista mutable con valores decimales:

fun main() {
    val grades = mutableListOf(3.0, 4.1, 2.0, 3.5, 4.0)
    val reversedGrades = grades.asReversed()

    println(grades)
    println(reversedGrades)

    grades[1] += 0.2
    reversedGrades -= 2.0
    println("\n Modificar notas")
    println(grades)
    println(reversedGrades)
}

Salida:

[3.0, 4.1, 2.0, 3.5, 4.0]
[4.0, 3.5, 2.0, 4.1, 3.0]

 Modificar notas
[3.0, 4.3, 3.5, 4.0]
[4.0, 3.5, 4.3, 3.0]

Como ves, al obtener la vista mutable en reverserdGrades puedes alterar el contenido de grades sin problema. Adicionar 0.2 a 4.1 resultó en 4.3 para ambas listas. Y eliminar la nota 2.0 de grades se reflejó en reversedGrades.

¿Ha sido útil esta publicación?