首页 > 解决方案 > 使用 Java 8 Stream 将泛型数组列表转换为非泛型

问题描述

我有一些我正在尝试简化的旧代码:

ArrayList arr = (generic arraylist)
int[] newArr = new int[arr.size()];
for(int i=0; i<arr.size(); i++){
    newArr[i]=(int)arr.get(i);
}

我想使用 Java Stream API 来简化这一点。这是我的尝试:

ArrayList arr = (generic arraylist)
List<Integer> = arr.stream().map(m -> (int)m).collect(Collectors.toList());

我的理解是它会遍历 arr,将每个对象 m 类型转换为一个 int,然后将它收集到一个 List 中。但是我的编译器说第二行的右侧返回对象而不是列表。我哪里错了?

标签: javaarraylistjava-stream

解决方案


根据您的尝试,您似乎想将您的映射ArrayListArrayList<Integer>. 好消息是,您无需执行任何操作。的运行时类型ArrayList<Integer>只是(如果您想搜索有关它的信息,ArrayList这称为类型擦除)。只有编译器知道参数化类型。

所以这段代码做你想做的事:

import java.util.ArrayList;

public class Cast {
    public static void main(String[] args) {
        //  This represents the ArrayList of Integer in your existing code
        ArrayList raw = new ArrayList(java.util.Arrays.asList(
            Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)
        ));

        //  You know what it is, so all you need to do is cast
        ArrayList<Integer> typed = (ArrayList<Integer>)raw;
        
        //  Still works; now recognized as list of integer
        for (Integer x : typed) {
            System.err.println(x);
        }
    }
}

推荐阅读