Преобразовать массив в список с определенным диапазоном в Java 8

Я хочу преобразовать один массив строк в список с определенным диапазоном. В моем случае я всегда хочу от индекса 1 до последнего индекса. Мне не нужно значение индекса 0, включенного в список. Есть ли прямой метод, который я могу использовать для фильтрации и преобразования в список по мере необходимости?

public class test1 {

    public static void main(String[] args) {
        String[] optArr = {"start", "map1", "map2", "map3"};
        List<String> list = Arrays.stream(optArr).collect(Collectors.toList());
        System.out.println(list);
    }
}

Ответ 1

Вы можете использовать Stream.skip():

List<String> list = Arrays.stream(optArr).skip(1).collect(Collectors.toList());

Ответ 2

Вы также можете использовать перегруженный метод Arrays.stream​(T[] array, int startInclusive, int endExclusive) как:

List<String> list = Arrays.stream(optArr, 1, optArr.length)
                          .collect(Collectors.toList());

Возвращает последовательный поток с указанным диапазоном указанного массив в качестве источника.


В качестве альтернативы (не Java-8) можно использовать subList, но я бы предпочел объединить его в одну строку вместо создания нового объекта как:

List<String> list = Arrays.asList(optArr).subList(1, optArr.length);

Ответ 3

Одной из опций, отличных от Java 8, может быть просто создать представление поверх текущего списка, в котором отсутствует первый элемент:

List<String> list = Arrays.stream(optArr).collect(Collectors.toList());
List<String> viewList = list.subList(1, list.size());

Это будет означать, однако, что базовая структура данных по-прежнему является исходным списком, но один дополнительный элемент в памяти не кажется большим штрафом.

Ответ 4

Один метод использует List.sublist(int,int)

List<String> list = Arrays.asList(optArr).subList(1,optArr.length);
System.out.println(list);

Второй метод использования Stream

List<String> list = Arrays.stream(optArr)
    .skip(1)
    .collect(Collectors.toList());
System.out.println(list);

Ответ 6

Глядя на ваши данные, вы можете рассмотреть:

List<String> list = Stream.of(optArr).filter(s -> s.startsWith("map")).collect(toList());

Но если вы просто хотите, чтобы отфильтровать первый индекс sublist является путем. Вам не нужно использовать поток везде, где вы можете.

Ответ 7

Так и должно быть.

List<String> al = new ArrayList<>(Arrays.asList(optArr));
List actualList = list.subList(1, al.size());

Ответ 8

Вы также можете использовать Arrays.copyOfRange для копирования массива.

Копирует указанный диапазон указанного массива в новый массив. Начальный индекс диапазона (от) должен лежать между нулем и оригинальной длиной, включительно.

public static <T> T[] copyOfRange(T[] original, int from, int to)

А затем конвертировать в List

List<String> result = Arrays.asList(Arrays.copyOfRange(optArr, 1, optArr.length));

IntStream: еще один способ использования IntStream

List<String> result = IntStream.range(1, optArr.length).mapToObj(i->optArr[i]).collect(Collectors.toList());

Ответ 9

Зачем вам нужно использовать потоки? Почему какой-то древней магии, такой как for-loop недостаточно для этой задачи?

String[] optArr = {"start", "map1", "map2", "map3"};
final List<String> list = new ArrayList<>();

for (int i = 1; i < optArr.length; i++) // skip first element
    list.add(optArr[i]);

Самый простой инструмент для работы.