【问题标题】:Convert generic arraylist to non-generic using Java 8 Stream使用 Java 8 Stream 将泛型数组列表转换为非泛型
【发布时间】:2021-03-28 11:17:17
【问题描述】:

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

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 中。但是我的编译器说第二行的右侧返回对象而不是列表。我哪里错了?

【问题讨论】:

标签: java arraylist java-stream


【解决方案1】:

根据您的尝试,您似乎想将您的 ArrayList 映射到 ArrayList&lt;Integer&gt;。好消息是,您无需执行任何操作。 ArrayList&lt;Integer&gt; 的运行时类型只是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);
        }
    }
}

【讨论】:

  • “raw”是这里的技术术语,而不是“untyped”。 ArrayList 本身就是一种类型。见tutorial
  • 谢谢!这是解决问题的一种更优雅/更简单的方法:)
  • 酷,@BasilBourque,我已更改变量名称以反映术语。
  • 您在typed = 中的变量名应该类似于parameterizedTyping =castWithGenerics =
  • 你不应该使用 Integer 构造函数,因为它们已被弃用。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多