-
25-09-2019 - |
题
我怎样转换成一系列个清单在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
原始的。把你列一个 List
与 Arrays.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(不可改变的真正名单)在两个方面:
List.copyOf(Arrays.asList(integers))
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[]
如果你的目标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});
用番石榴:
Integer[] array = { 1, 2, 3}; List<Integer> list = Lists.newArrayList(sourceArray);
使用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);