如何把List转成数组?一般情况我们可以使用集合类提供的Collection.toArray()
方法。
List<Integer> integerList = Arrays.asList(1,3,2);
//方法一,强制转换
Integer[] integerAry = (Integer[]) integerList.toArray();
//方法二,传入一个指定类型对象
Integer[] integerAry2 = integerList.toArray(new Integer[0]);
那么将List<Integer>转成int[]数组该如何处理呢?沿用以上方法的话:
int[] integerAry = (int[]) integerList.toArray();
//编译错误: Inconvertible types; cannot cast 'java.lang.Object[]' to 'int[]'
int[] integerAry2 = integerList.toArray(new int[0]);
//编译错误: no instance(s) of type variable(s) T exist so that int[] conforms to T[]
原因是,强制转换的泛型对象需要为引用类型,基本类型无法进行转换。这条路行不通,那就循环遍历进行手动转换...
int[] integerAry = new int[integerList.size()];
for (int i = 0; i < integerList.size(); i++){
integerAry[i] = integerList.get(i);
}
虽然也可以实现到预期效果,但有点麻烦,有没有简单点的方法呢?JDK1.8引入了Stream流概念可以把List转换成stream流,调用mapToInt方法将Integer对象转换成int类型,再调用toArray方法转换成数组。
int[] integerAry = integerList.stream().mapToInt(Integer::intValue).toArray();
同样可以将其他集合类型转换成stream流实现相同的效果,比如将上面的List换成Set集合,其实现代码是一模一样的。
Set<Integer> integerSet = new HashSet<>(Arrays.asList(1,2,3,2));
int[] integerAry = integerSet.stream().mapToInt(Integer::intValue).toArray();
反过来,把数组转换List,同样可行。
Arrays.stream(new String[]{"Mai", "Jelly"}).collect(Collectors.toList());
//对于基本类型数组,需要调用boxed()方法先进行装箱(转换成引用类型),才能封装成集合对象
Arrays.stream(new int[]{1, 3, 2}).boxed().collect(Collectors.toList());
stream流的出现大大降低了一些常用转换操作的代码量,其作用远不止此,与之搭配使用的还有Lambda表达式,有兴趣可以深入了解一下。
推荐学习文章:
深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。