13. Получить список без первых и последних трёх элементов
Условие задачи:
Дан List<String> произвольной длины.
Необходимо с помощью одного Stream API-конвейера получить новый список:
без первых трёх элементов;
без последних трёх элементов.
Если в исходном списке шесть элементов или меньше, результат должен быть пустым.
Код:
List<String> list = List.of(
"a", "b", "c", "d", "e",
"f", "g", "h", "i", "j"
);
Спойлеры к решению
Подсказки
💡 Первые три элемента можно пропустить через
💡 После этого нужно оставить только
💡 Для ограничения количества элементов используй
💡 Для коротких списков количество элементов нужно ограничить снизу нулём.
skip(3).💡 После этого нужно оставить только
list.size() - 6 элементов.💡 Для ограничения количества элементов используй
limit().💡 Для коротких списков количество элементов нужно ограничить снизу нулём.
Решение
List<String> result = list.stream()
.skip(3)
.limit(Math.max(0, list.size() - 6L))
.toList();
Сначала:
.skip(3)
пропускает первые три элемента.
После удаления трёх элементов с начала и трёх с конца в результате должно остаться:
list.size() - 6
элементов.
Поэтому:
.limit(Math.max(0, list.size() - 6L))
оставляет только необходимую часть списка.
Для исходных данных:
[a, b, c, d, e, f, g, h, i, j]
результат:
[d, e, f, g]
Если размер списка <= 6, Math.max() передаст в limit() значение 0, и результатом будет пустой список.
Если используется Java до версии 16:
List<String> result = list.stream()
.skip(3)
.limit(Math.max(0, list.size() - 6L))
.collect(Collectors.toList());
Временная сложность — O(n), дополнительная память — O(n) для результата.