将对象数组转换为其基本类型的数组

Il-*_*ima 78 java arrays primitive-types

如果您有一个具有基本类型的Java对象数组(例如Byte,Integer,Char等).有没有一种简洁的方法我可以将它转换为原始类型的数组?特别是可以在不必创建新数组并遍历内容的情况下完成此操作.

例如,给定

Integer[] array
Run Code Online (Sandbox Code Playgroud)

什么是将其转换为最佳方式

int[] intArray
Run Code Online (Sandbox Code Playgroud)

不幸的是,当Hibernate与我们无法控制的某些第三方库之间进行交互时,我们必须经常这样做.这似乎是一个非常常见的操作,所以如果没有捷径我会感到惊讶.

谢谢你的帮助!

Gui*_*ume 88

Apache Commons Lang再次成为你的朋友.它们提供了ArrayUtils.toPrimitive(),它可以完全满足您的需求.您可以指定处理空值的方式.


Ale*_*lex 61

使用Java 8中引入的可以完成:

int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)

但是,目前只有原始流int,longdouble.如果您需要转换为另一种原始类型,例如byte没有外部库的最短路径,则:

byte[] byteArray = new byte[array.length];
for(int i = 0; i < array.length; i++) byteArray[i] = array[i];
Run Code Online (Sandbox Code Playgroud)

或者,如果需要,可以用流替换for循环:

IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);
Run Code Online (Sandbox Code Playgroud)

NullPointerException如果您的任何元素都是,那么所有这些都会抛出null.

  • 而不是`Integer :: intValue`,你也可以使用`i - > i`(使用拆箱). (2认同)
  • @robinst 并且拆箱是编译器为您调用 `Integer::intValue` ,那么当该方法随时可用时为什么要创建一个新的 lambda 呢? (2认同)

Zac*_*ena 40

不幸的是,Java平台中没有任何东西可以做到这一点.顺便说一下,你还需要显式处理数组中的null元素Integer[](int你将为这些元素使用什么?).

  • 关于空值的好点.出于我的目的,如果其中一个条目为null,我将接受抛出异常,就像在取消对象对象时抛出NullPointerException一样. (6认同)
  • 对于Java 8,这个答案已不再准确,请参阅[Alex的回答](http://stackoverflow.com/a/24720136/305973). (2认同)

Pau*_*ora 26

使用番石榴:

int[] intArray = Ints.toArray(Arrays.asList(array));
Run Code Online (Sandbox Code Playgroud)

文档: