我想将一个字符串数组转换为具有特定范围的列表。就我而言,我总是想要从索引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);
}
}
答案 0 :(得分:17)
您还可以将重载方法Arrays.stream(T[] array, int startInclusive, int endExclusive)
用作:
List<String> list = Arrays.stream(optArr, 1, optArr.length)
.collect(Collectors.toList());
返回具有指定范围的连续Stream 数组作为其来源。
或者(非Java-8),也可以选择使用subList
,但是我宁愿将其链接成一行,而不是像这样创建新对象:
List<String> list = Arrays.asList(optArr).subList(1, optArr.length);
答案 1 :(得分:14)
您可以使用Stream.skip()
:
List<String> list = Arrays.stream(optArr).skip(1).collect(Collectors.toList());
答案 2 :(得分:4)
一个非Java 8选项可能是只在当前列表的顶部创建一个视图,该视图忽略了第一个元素:
List<String> list = Arrays.stream(optArr).collect(Collectors.toList());
List<String> viewList = list.subList(1, list.size());
这意味着尽管底层数据结构仍然是原始列表,但是内存中的一个额外元素似乎并没有太大的代价。
答案 3 :(得分:3)
一种方法使用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);
答案 4 :(得分:2)
您还可以使用Arrays.copyOfRange
复制数组。
将指定数组的指定范围复制到新数组中。 (从)范围的初始索引必须介于零和original.length之间(包括首尾)。
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());
答案 5 :(得分:1)
List<String> list = Arrays.stream(optArr).skip(1).collect(Collectors.toList());
我认为它必须起作用。
在此处查看文档:{{3}}
答案 6 :(得分:1)
查看数据时,您可能会考虑:
List<String> list = Stream.of(optArr).filter(s -> s.startsWith("map")).collect(toList());
但是,如果您只想过滤第一个索引sublist
,则是一种方法。
您无需在任何可能的地方使用流。
答案 7 :(得分:1)
应该是这样。
List<String> al = new ArrayList<>(Arrays.asList(optArr));
List actualList = list.subList(1, al.size());
答案 8 :(得分:1)
为什么需要使用流?为什么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]);
该作业的最简单工具。