我怎样转换成一系列个清单在Java?

我用的 Arrays.asList() 但行为(并签名)以某种方式改变了,从Java SE 1.4.2 (docs现在档案)来 8 最片我发现的在网络上使用的1.4.2的行为。

例如:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 在1.4.2返回一个列表,其中包含的元素1,2,3
  • 在升级到1.5.0+返回一个列表,其中包含的阵垃圾邮件

在许多情况下它应该很容易检测,但有时它可以滑被忽视:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
有帮助吗?

解决方案

在你的例子,这是因为你不能拥有一个列表中的一种原始的类型。换句话说, List<int> 是不可能的。

你可以,但是,有一个 List<Integer> 使用 Integer 类包装的 int 原始的。把你列一个 ListArrays.asList 实用方法。

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

看看这个 代码生活在运行IdeOne.com.

其他提示

在Java8,可以使用流:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

说到关于转换的方式,这取决于你为什么需要你 List.如果你需要的只读数据。好吧,在这里,你去:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

但随后如果你做事情是这样的:

list.add(1);

你得到 java.lang.UnsupportedOperationException.因此,对于一些情况下甚至需要这样的:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

第一种办法实际上没有转换阵列,但是'代表'一样 List.但阵列是在引擎盖下的所有其特性的固定数目的因素。请注意,需要指定类型当构造 ArrayList.

问题是,varargs得到了介绍了在Java5和不幸的是, Arrays.asList() 得到了超负荷的一个vararg版本。所以 Arrays.asList(spam) 被理解为由Java5编译器作为一个vararg参数的int阵列。

这个问题进行更加详细的有效Java2nd Ed., 第7章,项目42.

这似乎有点晚了,但这是我的两个美分。我们不能有 List<int> 作为 int 是一种原始的类型所以我们只能有 List<Integer>.

Java8(int阵列)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java8和下文(Integer阵列)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

需要对列表并不清单?

在情况下,我们想要一个特定的执行情况 List 例如 ArrayList 然后我们可以使用 toCollection 为:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

为什么 list21 不能在结构上的修改的?

当我们使用 Arrays.asList 尺寸的返回列为固定的,因为返回的列表是不是 java.util.ArrayList, 但私人类的静态定义的内部 java.util.Arrays.因此,如果我们添加或删除的元素从返回的列表, UnsupportedOperationException 会被抛出。因此,我们应该去 list22 当我们想要修改的列表。如果我们有Java8然后我们还可以去 list23.

到是清楚的 list21 可以修改意义上,我们可以叫 list21.set(index,element) 但是这一清单可能不是结构上的修改即不能增加或删除的要素。你还可以检查这个 的问题.


如果我们想要一个不可改变的名单然后我们可以把它作为:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

还有一点要注意的是,该方法 Collections.unmodifiableList 返回的一个不可修改的图规定的清单。一个不可修改的图集是一个集合,是不可修改的,也是一个查到一个背收集。注意到这一变化的背收集可能仍然是可能的,并且如果他们有发生,他们是可见通过的不可修改的图。

我们可以有一个真正不可改变的清单在Java10.

Java10(不可改变的真正名单)在两个方面:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

还要检查这个 答案 我更多。

我最近不得不转换成一系列到名单。后来的程序过滤清单试图删除的数据。当你使用的阵列。asList(array)的功能,创建一个固定的尺寸的集合:你可以既不增加也不是删除。此项解释的问题比我可以: 为什么我得到UnsupportedOperationException时,试图消除的一个元素从一个名单?.

最后,我不得不做一个"手册"转换:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

我想我可能已加入的转换从一系列一个列表中使用的清单。addAll(项目)的操作。

甚至短:

List<Integer> list = Arrays.asList(1, 2, 3, 4);

使用数组

这是最简单的方式转换成一系列要 List.然而,如果试图添加一个新的元素或删除现有的元素的列表, UnsupportedOperationException 会被抛出。

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

使用对列表或其他清单的实现

你可以使用 for 环添加的所有要素列入一个 List 实施,例如 ArrayList:

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

使用流API in Java8

你可以把列入一个流,然后收集的流使用不同的收藏家:默认的集Java8中的使用 ArrayList 屏幕背后,但你还可以施加你的首选执行情况。

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

参见:

另一个解决方法如果使用apache commons-lang:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

哪里 ArrayUtils.toObject 转换 int[]Integer[]

在Java9你有更典雅的解决方案的使用不可改变的名单通过新的便利工厂的方法 List.of:

List<String> immutableList = List.of("one","two","three");

(无耻地从复制 在这里, )

如果你的目标Java8(或以后),就可以试试这个:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

注:

注意到 Collectors.<Integer>toList(), 这一般方法可以帮助你,以避免的错误"类型的不匹配:不能转换 List<Object>List<Integer>".

你必须投向阵列

Arrays.asList((Object[]) array)

一个班轮:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
  1. 用番石榴:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
  2. 使用Apache Commons集合:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);
    

因此,这取决于其Java version你想-

Java7

 Arrays.asList(1, 2, 3);

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

在Java8

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

参考 - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/

如果这有助于:我有同样的问题,并简单地写了一个通用的职能,需要一系列和返回。同一类型的同样的内容:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

鉴阵列:

    int[] givenArray = {2,2,3,3,4,5};

转换整数列于整数列

一个办法:盒装的()->返回IntStream

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

第二种方式:地图上的每个元素的流到整数,然后收集

注: 使用mapToObj你可以隐蔽的每一个int件进入串流,char流等的外壳我要(char)我

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

换一个阵列类型的另一种类型的例子:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

使用两个线的代码转换阵列,如果你用它在整数值 你必须使用自动装箱类型的对基本数据类型

  Integer [] arr={1,2};
  Arrays.asList(arr);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top