Использование Stream API для проверки сортировки
На этом этапе мы рассмотрим более современный и часто более компактный способ проверки, отсортирован ли список, с использованием Stream API Java. Stream API, введенное в Java 8, предоставляет функциональный подход к обработке коллекций данных.
Мы модифицируем нашу предыдущую программу, добавив метод, который будет проверять, отсортирован ли список по возрастанию с использованием потоков (streams).
Откройте файл ListComparison.java
в редакторе WebIDE. Добавьте новый метод с именем isSortedAscending
в класс ListComparison
, вне метода main
, но внутри фигурных скобок {}
класса ListComparison
.
Вот обновленный код для 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);
}
}
Рассмотрим новые части кода:
import java.util.stream.IntStream;
: Эта строка импортирует класс IntStream
, который полезен для работы с последовательностями целых чисел в потоках.
public static boolean isSortedAscending(List<Integer> list)
: Эта строка объявляет новый статический метод с именем isSortedAscending
, который принимает список (List
) целых чисел (Integer
) и возвращает логическое значение (boolean
, true
, если список отсортирован, и false
в противном случае).
if (list == null || list.size() <= 1)
: Этот код обрабатывает крайние случаи: пустой список или список с одним элементом всегда считается отсортированным.
IntStream.range(0, list.size() - 1)
: Этот код создает поток целых чисел от 0 до (но не включая) list.size() - 1
. Эти целые числа представляют индексы элементов списка, которые мы хотим сравнить.
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0)
: Это ядро операции с потоком.
allMatch()
- это терминальная операция, которая проверяет, удовлетворяют ли все элементы потока заданному условию.
i -> list.get(i).compareTo(list.get(i + 1)) <= 0
- это лямбда-выражение, которое определяет условие. Для каждого индекса i
из IntStream
оно получает элемент по индексу i
и элемент по индексу i + 1
.
list.get(i).compareTo(list.get(i + 1))
сравнивает два элемента. Метод compareTo
возвращает отрицательное целое число, если первый элемент меньше второго, ноль, если они равны, и положительное целое число, если первый элемент больше второго.
<= 0
проверяет, является ли результат compareTo
меньше или равным нулю. Это условие истинно, если текущий элемент меньше или равен следующему элементу, что соответствует определению сортировки по возрастанию.
allMatch
возвращает true
только в том случае, если это условие истинно для всех соседних пар элементов в списке.
Сохраните файл ListComparison.java
.
Теперь скомпилируйте и запустите обновленную программу в терминале:
javac ListComparison.java
java ListComparison
Теперь вывод должен показывать, отсортирован ли список по возрастанию на основе метода isSortedAscending
:
Original list: [1, 3, 2, 4, 5]
The list is NOT sorted in ascending order.
Измените список в методе main
так, чтобы он был отсортирован, например:
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
Сохраните файл, скомпилируйте и запустите программу снова. Теперь вывод должен быть следующим:
Original list: [1, 2, 3, 4, 5]
The list is sorted in ascending order.
Это демонстрирует, как использовать Stream API для выполнения компактной проверки сортировки по возрастанию.