繁体   English   中英

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

[英]Convert an array to list with specific range in 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);
    }
}

您还可以使用重载方法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);

您可以使用Stream.skip()

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

一个非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复制数组。

将指定数组的指定范围复制到新数组中。 范围(from)的初始索引必须介于0和original.length之间(包括0和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());

为什么需要使用流? 为什么没有像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]);

这项工作最简单的工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM