Получить список без первых и последних трёх элементов

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) для результата.