Utilizar la API de flujos (Stream API) para comprobar si una lista está ordenada
En este paso, exploraremos una forma más moderna y a menudo más concisa de comprobar si una lista está ordenada utilizando la API de flujos (Stream API) de Java. La API de flujos, introducida en Java 8, proporciona un enfoque funcional para procesar colecciones de datos.
Modificaremos nuestro programa anterior para incluir un método que compruebe si la lista está ordenada en orden ascendente utilizando flujos.
Abre el archivo ListComparison.java
en el editor del WebIDE. Agrega un nuevo método llamado isSortedAscending
a la clase ListComparison
, fuera del método main
pero dentro de las llaves {}
de la clase ListComparison
.
Aquí está el código actualizado de ListComparison.java
:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class ListComparison {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(3);
numbers.add(2);
numbers.add(4);
numbers.add(5);
System.out.println("Original list: " + numbers);
// Check if the list is sorted using the new method
boolean sorted = isSortedAscending(numbers);
if (sorted) {
System.out.println("The list is sorted in ascending order.");
} else {
System.out.println("The list is NOT sorted in ascending order.");
}
// The previous loop for comparison is removed for simplicity in this step
// but you can keep it if you want to see both methods in action.
}
// Method to check if the list is sorted in ascending order using Streams
public static boolean isSortedAscending(List<Integer> list) {
if (list == null || list.size() <= 1) {
return true; // An empty or single-element list is considered sorted
}
return IntStream.range(0, list.size() - 1)
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0);
}
}
Veamos las nuevas partes:
import java.util.stream.IntStream;
: Esto importa la clase IntStream
, que es útil para trabajar con secuencias de enteros en flujos.
public static boolean isSortedAscending(List<Integer> list)
: Esto declara un nuevo método estático llamado isSortedAscending
que toma una List
de Integer
y devuelve un boolean
(true si está ordenada, false en caso contrario).
if (list == null || list.size() <= 1)
: Esto maneja casos extremos: una lista vacía o una lista con un solo elemento siempre se considera ordenada.
IntStream.range(0, list.size() - 1)
: Esto crea un flujo de enteros desde 0 hasta (pero sin incluir) list.size() - 1
. Estos enteros representan los índices de los elementos de la lista que queremos comparar.
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0)
: Este es el núcleo de la operación de flujo.
allMatch()
es una operación terminal que comprueba si todos los elementos del flujo cumplen una determinada condición.
i -> list.get(i).compareTo(list.get(i + 1)) <= 0
es una expresión lambda que define la condición. Para cada índice i
del IntStream
, obtiene el elemento en el índice i
y el elemento en el índice i + 1
.
list.get(i).compareTo(list.get(i + 1))
compara los dos elementos. compareTo
devuelve un entero negativo si el primer elemento es menor que el segundo, cero si son iguales y un entero positivo si el primer elemento es mayor que el segundo.
<= 0
comprueba si el resultado de compareTo
es menor o igual a cero. Esta condición es verdadera si el elemento actual es menor o igual al siguiente elemento, que es la definición de orden ascendente.
allMatch
devuelve true
solo si esta condición es verdadera para todos los pares adyacentes de la lista.
Guarda el archivo ListComparison.java
.
Ahora, compila y ejecuta el programa actualizado en la Terminal:
javac ListComparison.java
java ListComparison
La salida ahora debe indicar si la lista está ordenada en orden ascendente según el método isSortedAscending
:
Original list: [1, 3, 2, 4, 5]
The list is NOT sorted in ascending order.
Modifica la lista en el método main
para que esté ordenada, por ejemplo:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
Guarda el archivo, compila y ejecuta de nuevo. La salida ahora debe ser:
Original list: [1, 2, 3, 4, 5]
The list is sorted in ascending order.
Esto demuestra cómo utilizar la API de flujos para realizar una comprobación concisa de orden ascendente.