Есть список. Есть цикл. Как в цикле указать последний элемент списка?
Но все равно интересно, если бы я удаление элемента оставил бы перед циклом. Получается что при выполнении цикла был бы сбой, так как индекс последнего элемента я установил «4», а удалив элемент с индексом 2, 4 сместился бы, ведь насколько я знаю это преимущество списков, что при удалении дыр, как в массивах не остается. Ну вот, сместился бы 4 индекс на единицу влево и цикл бы отработал некорректно, да? Или нет?
Нахождение последнего элемента в стриме
Иногда возникает задача нахождения последнего элемента в стриме. Первый элемент можно получить с помощью метода findFirst, но как же найти последний?
Поиск последнего элемента
Для нахождения последнего элемента можно воспользоваться оператором reduce, который принимает на вход два элемента стрима и возвращает один:
public static T getLastElement(Stream stream) < return stream .reduce((e1, e2) ->e2) .orElse(null); >
В данном случае нам нужно всегда возвращать второй аргумент их двух переданных — и, в конце концов, мы получим на выходе последний элемент. Точнее, получим Optional, который может содержать элемент или быть пустым.

Исходный код
import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class GetLastElementInStream < public static void main(String[] args) < Listids = Arrays.asList("111", "222", "333", "444", "555", "666", "777"); System.out.println("Все элементы: " + ids); String lastElement = getLastElement(ids.stream()); System.out.println("Последний элемент: " + lastElement); > public static T getLastElement(Stream stream) < return stream .reduce((e1, e2) ->e2) .orElse(null); > >
Заключение
Для нахождения последнего элемента в стриме проще всего использовать метод reduce, который с каждой итерацией уменьшает количество элементов на 1 и в итоге мы получим последний оставшийся элемент стрима.
Нахождение последнего элемента в стриме
- ← Поиск дубликатов в Stream
- Нахождение первого элемента в стриме →
Как получить последний элемент потока в Java?
API Java Stream был основной функцией выпуска Java 8. Потоки представляют собой последовательности объектов с ленивой оценкой и предоставляют богатый, плавный и похожий на монадический API.
В этой статье мы кратко рассмотрим способы получения последнего элемента потока. Имейте в виду, что из-за природы потоков это не естественная операция . Всегда убедитесь, что вы не работаете с бесконечными потоками.
2. Использование API сокращения
Проще говоря, Reduce уменьшает набор элементов в потоке до одного элемента.
В этом случае мы уменьшим набор элементов, чтобы получить последний элемент в потоке. Имейте в виду, что этот метод будет возвращать детерминированные результаты только для последовательных потоков.
Давайте воспользуемся списком строковых значений , получим поток из списка и затем уменьшим:
ListString> valueList = new ArrayList>(); valueList.add("Joe"); valueList.add("John"); valueList.add("Sean"); StreamString> stream = valueList.stream(); stream.reduce((first, second) -> second) .orElse(null);
Здесь поток сокращается до уровня, на котором остается только последний элемент. Если поток пуст, он вернет нулевое значение.
2. Использование функции пропуска
Другой способ получить последний элемент потока — пропустить все элементы перед ним . Этого можно добиться с помощью функции Skip класса Stream . Имейте в виду, что в данном случае поток используется дважды, поэтому производительность заметно снижается .
Давайте создадим список строковых значений и используем его функцию размера , чтобы определить, сколько элементов нужно пропустить, чтобы достичь последнего элемента.
Вот пример кода, получающего последний элемент с помощью skip :
ListString> valueList = new ArrayListString>(); valueList.add("Joe"); valueList.add("John"); valueList.add("Sean"); long count = valueList.stream().count(); StreamString> stream = valueList.stream(); stream.skip(count - 1).findFirst().get();
«Шон» оказывается последним элементом.
4. Получение последнего элемента бесконечного потока
Попытка получить последний элемент бесконечного потока привела бы к бесконечной последовательности вычислений, выполняемых для бесконечных элементов. Как skip , так и reduce не вернутся из выполнения оценки, если мы не ограничим бесконечный поток определенным количеством элементов, используя операцию ограничения .
Вот пример кода, где мы взяли бесконечный поток и попытались получить последний элемент:
StreamInteger> stream = Stream.iterate(0, i -> i + 1); stream.reduce((first, second) -> second).orElse(null);
Следовательно, поток не вернется из оценки и в конечном итоге остановит выполнение программы .
5. Вывод
Мы видели разные способы получения последнего элемента потока как с помощью API сокращения , так и с помощью Skip . Мы также рассмотрели, почему это невозможно с бесконечными потоками.
Мы видели, что получить последний элемент из Stream непросто по сравнению с его извлечением из других структур данных. Это связано с ленивым характером потоков , которые не оцениваются, пока не будет вызвана терминальная функция, и мы никогда не узнаем, является ли текущий оцениваемый элемент последним.
Фрагменты кода можно найти на GitHub.
- 1. Обзор
- 2. Использование API сокращения
- 2. Использование функции пропуска
- 4. Получение последнего элемента бесконечного потока
- 5. Вывод
Получаем последний элемент массива в JavaScript
Массив в JavaScript — это объект-контейнер, содержащий фиксированное количество значений одного типа. Длина массива, после его создания, останется постоянной. В данной статье мы рассмотрим различные методы доступа к последнему элементу массива.
Как получить последний элемент массива?
1 — Используем метод slice() массива для возврата определенного элемента.
2 — Извлекаем последний элемент, используя массив отрицательных индексов array.slice(-1).
3 — Сохраняем искомое значение в переменной.
Далее мы рассмотрим варианты реализации кода.
Использование свойства длины массива.
Свойство length возвращает количество элементов в массиве. Вычитание 1 из длины массива дает индекс последнего элемента массива, с помощью которого можно получить доступ к последнему элементу. Причина, по которой мы вычитаем 1 из длины, заключается в том, что в JavaScript нумерация индексов массива начинается с 0. т. е. индекс 1-го элемента будет равен 0. Поэтому индекс последнего элемента будет равен длине массива-1.
let array = [2, 4, 6, 8, 10, 12, 14, 16];
let lastElem = array[array.length — 1];
Использование метода slice().
Метод slice() возвращает определенные элементы из массива в виде нового объекта массива. Этот метод выбирает элементы, начинающиеся с заданного начального индекса и заканчивающиеся заданным конечным индексом, исключая элемент в конечном индексе. Метод slice() не изменяет существующий массив. Предоставление одного значения индекса возвращает элемент в этой позиции, а отрицательное значение индекса вычисляет индекс с конца массива.
let array = [2, 4, 6, 8, 10, 12, 14, 16];
let lastElem = array.slice(-1);
Использование метода pop().
Метод pop() извлекает/удаляет последний элемент массива и возвращает его. Этот метод изменяет длину массива.
let array = [2, 4, 6, 8, 10, 12, 14, 16];
let lastElem = array.pop();
Давайте теперь используем все три метода для массива, чтобы получить последний элемент и проверить, какой метод является самым быстрым:
let array = [2, 4, 6, 8, 10, 12, 14, 16];
console.time(‘array length property’);
let lastElem = array[array.length — 1];
console.log(lastElem);
console.timeEnd(‘array length property’);
console.time(‘array slice method’);
let lastElem1 = array.slice(-1);
console.log(lastElem1);
console.timeEnd(‘array slice method’);
console.time(‘array pop method’);
let lastElem2 = array.pop();
console.log(lastElem2);
console.timeEnd(‘array pop method’);
//16
//array length property: 7 ms
//[ 16 ]
//array slice method: 5 ms
//16
//array pop method: 2 ms
И как вы можете видеть, метод pop() является самым быстрым. Вы можете использовать его, если вас устраивает изменение массива. Если вы не хотите изменять массив, то используйте метод slice().

![]()
Создано 14.09.2021 09:42:02
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.