Ответ 1
Вы можете использовать Stream.skip()
:
List<String> list = Arrays.stream(optArr).skip(1).collect(Collectors.toList());
Я хочу преобразовать один массив строк в список с определенным диапазоном. В моем случае я всегда хочу от индекса 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);
}
}
Вы можете использовать Stream.skip()
:
List<String> list = Arrays.stream(optArr).skip(1).collect(Collectors.toList());
Вы также можете использовать перегруженный метод 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);
Одной из опций, отличных от Java 8, может быть просто создать представление поверх текущего списка, в котором отсутствует первый элемент:
List<String> list = Arrays.stream(optArr).collect(Collectors.toList());
List<String> viewList = list.subList(1, list.size());
Это будет означать, однако, что базовая структура данных по-прежнему является исходным списком, но один дополнительный элемент в памяти не кажется большим штрафом.
Один метод использует 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);
List<String> list = Arrays.stream(optArr).skip(1).collect(Collectors.toList());
Я думаю, что это должно работать.
Смотрите документы здесь: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html.
Глядя на ваши данные, вы можете рассмотреть:
List<String> list = Stream.of(optArr).filter(s -> s.startsWith("map")).collect(toList());
Но если вы просто хотите, чтобы отфильтровать первый индекс sublist
является путем. Вам не нужно использовать поток везде, где вы можете.
Так и должно быть.
List<String> al = new ArrayList<>(Arrays.asList(optArr));
List actualList = list.subList(1, al.size());
Вы также можете использовать 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());
Зачем вам нужно использовать потоки? Почему какой-то древней магии, такой как 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]);
Самый простой инструмент для работы.