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) для результирующего списка.