在Java 8中将数组转换为具有特定范围的列表

时间:2018-12-27 06:23:34

标签: java 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);
    }
}

9 个答案:

答案 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]);

该作业的最简单工具。