如何在 Java 中将 List<Integer> 转换为 int\[\]?

新手上路,请多包涵

我是 Java 的新手。如何在 Java 中将 — 转换为 List<Integer> int[]

I’m confused because List.toArray() actually returns an Object[] , which can be cast to neither Integer[] nor int[] .

现在我正在使用一个循环来这样做:

 int[] toIntArray(List<Integer> list) {
  int[] ret = new int[list.size()];
  for(int i = 0; i < ret.length; i++)
    ret[i] = list.get(i);
  return ret;
}

有更好的方法吗?

这类似于问题 How can I convert int[] to Integer[] in Java? .

原文由 unknown 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 609
2 个回答

不幸的是,由于 Java 处理基本类型、装箱、数组和泛型的性质,我不认为真的 更好的方法来做到这一点。尤其是:

  • List<T>.toArray 将无法工作,因为没有从 Integerint 的转换
  • 您不能使用 int 作为泛型的类型参数,因此它 必须int 特定的方法(或使用反射来进行讨厌的欺骗的方法)。

我相信有些库为所有原始类型自动生成了这种方法的版本(即有一个为每种类型复制的模板)。这很丑陋,但恐怕就是这样:(

即使 Arrays 类在泛型出现在 Java 之前就出现了,但如果今天引入它,它仍然必须包含所有可怕的重载(假设您想使用原始数组)。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 2.5 许可协议

通过在 Java 8 中添加流,我们可以编写如下代码:

 int[] example1 = list.stream().mapToInt(i->i).toArray();
// OR
int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();


思考过程:

  • 简单的 Stream#toArray 返回一个 Object[] 数组,所以这不是我们想要的。此外, Stream#toArray(IntFunction<A[]> generator) 不做我们想要的,因为通用类型 A 不能代表原始类型 int

  • 因此,最好有一些可以处理原始类型的流 int 而不是包装器 Integer ,因为它的 toArray 也很可能会返回一个方法 int[] 数组(返回类似 Object[] 或什至盒装 Integer[] 的其他东西在这里是不自然的)。幸运的是 Java 8 有这样一个流 IntStream

  • 所以现在我们唯一需要弄清楚的是如何将我们的 Stream<Integer> (将从 list.stream() 返回)转换为闪亮的 IntStream

快速搜索 Stream 的文档,同时寻找返回 IntStream 的方法,将我们指向我们的解决方案,即 mapToInt(ToIntFunction<? super T> mapper) 方法。我们需要做的就是提供从 Integerint 的映射。

由于 ToIntFunction 是 _功能接口_,我们可以通过 lambda方法引用 提供其实例。

无论如何要将 Integer 转换为 int 我们可以使用 Integer#intValue 所以在 mapToInt 我们可以写:

   mapToInt( (Integer i) -> i.intValue() )

(或者有些人可能更喜欢: mapToInt(Integer::intValue) 。)

但是可以使用拆箱生成类似的代码,因为编译器知道这个 lambda 的结果必须是类型 int (在 mapToInt 中使用的 lambda 是 ToIntFunction 期望作为主体的接口类型的方法: int applyAsInt(T value) 预计返回 int )。

所以我们可以简单地写:

   mapToInt((Integer i)->i)

Also, since the Integer type in (Integer i) can be inferred by the compiler because List<Integer>#stream() returns a Stream<Integer> , we can also skip it which留给我们

  mapToInt(i -> i)

原文由 Pshemo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题