Sav*_*sis 54 java arrays list variadic-functions
我有一个float [],我想得到一个具有相同元素的列表.我可以做一个又一个添加它们的丑陋的事情,但我想使用Arrays.asList方法.但是有一个问题.这有效:
List<Integer> list = Arrays.asList(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Run Code Online (Sandbox Code Playgroud)
asList方法接受一个varargs参数,对我来说,扩展是一个数组的"简写".
问题:
为什么第二段代码返回List<int[]>
但不返回List<int>
.
有没有办法纠正它?
为什么自动装箱不在这里工作; 即int[]
到Integer[]
?
Jon*_*eet 74
List<int>
在Java中没有这样的东西- 泛型不支持原语.
自动装箱只发生在单个元素上,而不是基元数组.
至于如何纠正它 - 有各种各样的库,有很多方法可以做这样的事情.没有办法围绕这个,我认为在JDK中没有任何东西可以让它变得更容易.有些人会包裹在包装类型(让拳击发生在接入),其他人将通过独创的阵列,因为他们去重复,以创建一个独立的副本,装箱清单的基本数组.确保您知道自己在使用哪个.
(编辑:我一直认为一个人的起点int[]
是不可谈判的.如果你可以从一个开始Integer[]
那么你很好:)
仅举一个辅助库的例子,并插入一点Guava,就是这样com.google.common.primitive.Ints.asList
.
JRL*_*JRL 30
这个怎么样?
Integer[] ints = new Integer[] {1,2,3,4,5};
List<Integer> list = Arrays.asList(ints);
Run Code Online (Sandbox Code Playgroud)
Chs*_*y76 15
因为java数组是对象,Arrays.asList()
并将您的int数组视为varargs列表中的单个参数.
YoY*_*oYo 13
输入Java 8,您可以执行以下操作来收集盒装数组:
Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);
Run Code Online (Sandbox Code Playgroud)
或者这个收集在盒装列表中
List<Integer> boxedInts = IntStream.of(ints).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
然而,这仅适用于int[]
,long[]
和double[]
.这不适用byte[]
.
请注意Arrays.stream(ints)
并且IntStream.of(ints)
是等效的.所以前面的两个例子也可以改写为:
Integer[] boxedIntArray = Arrays.stream(ints).boxed().toArray(Integer[]::new);
List<Integer> boxedIntList = Arrays.stream(ints).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
最后一种形式可能是有利的,因为它省略了原始的特定子类型Stream
.但是,在内部它仍然是一堆重载的,在这种情况下仍然在IntStream
内部创建.
问题不在于Arrays.asList()
。问题是您希望自动装箱能够在阵列上工作,但事实并非如此。在第一种情况下,编译器在查看各个int用途之前将其自动装箱。在第二种情况下,您首先将它们放入一个int数组(无需自动装箱),然后将其传递给Arrays.asList()
(不可能进行自动装箱)。