Удалить элементы списка с нечётными индексами

16. Удалить элементы списка с нечётными индексами

Условие задачи:
Дан список строк inList.

Необходимо с помощью Stream API получить новый список, содержащий только элементы с чётными индексами:

0, 2, 4, 6, ...

То есть элементы с нечётными индексами нужно исключить.

Код:

public class Main {
    public static void main(String[] args) {
        List<String> inList = List.of(
                "a", "b", "c", "d", "e", "g"
        );

        List<String> outList = inList /* do something */;

        System.out.println(outList); // [a, c, e]
    }
}

Спойлеры к решению

Подсказки
💡 В обычном Stream<String> индекс элемента недоступен напрямую.
💡 Поэтому можно создать поток индексов через IntStream.range().
💡 Оставь только чётные индексы через filter().
💡 Затем преобразуй каждый индекс обратно в элемент списка через inList.get(i).

Решение
List<String> outList = IntStream.range(0, inList.size())
        .filter(i -> i % 2 == 0)
        .mapToObj(inList::get)
        .collect(Collectors.toList());

Сначала:

IntStream.range(0, inList.size())

создаёт последовательность индексов:

0, 1, 2, 3, 4, 5

Затем:

.filter(i -> i % 2 == 0)

оставляет только чётные индексы:

0, 2, 4

После этого:

.mapToObj(inList::get)

преобразует индексы обратно в элементы списка.

Для исходных данных результат будет:

[a, c, e]

Если используется Java 16+, можно записать короче:

List<String> outList = IntStream.range(0, inList.size())
        .filter(i -> i % 2 == 0)
        .mapToObj(inList::get)
        .toList();

Для списков с быстрым доступом по индексу, например ArrayList или List.of(...), временная сложность — O(n), дополнительная память — O(n) для результирующего списка.