Java 数字类型集合转换成基本类型数组 (如:List转int[])

如何把List转成数组?一般情况我们可以使用集合类提供的Collection.toArray()方法。

List integerList = Arrays.asList(1,3,2);
//方法一,强制转换
Integer[] integerAry = (Integer[]) integerList.toArray();
//方法二,传入一个指定类型对象
Integer[] integerAry2 = integerList.toArray(new Integer[0]);

那么将List转成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 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和并行)

你可能感兴趣的