Konvertieren eines Array von Objekten in ein Array ihrer primitiven Typen

Wenn Sie ein Array von Java-Objekten haben, die einen primitiven Typ haben (zum Beispiel Byte, Integer, Char, usw.). Gibt es eine nette Möglichkeit, es in ein Array des primitiven Typs umzuwandeln? Dies kann insbesondere erfolgen, ohne dass ein neues Array erstellt und der Inhalt durchlaufen werden muss.

So zum Beispiel, gegeben

Integer[] array 

Was ist der beste Weg, um dies zu konvertieren?

 int[] intArray 

Unglücklicherweise müssen wir dies ziemlich häufig tun, wenn wir zwischen Hibernate und einigen Bibliotheken von Drittanbietern, über die wir keine Kontrolle haben, eine Schnittstelle herstellen können. Es scheint, dass dies eine ziemlich häufige Operation wäre, also wäre ich überrascht, wenn es keine Abkürzung gibt.

Danke für Ihre Hilfe!

Solutions Collecting From Web of "Konvertieren eines Array von Objekten in ein Array ihrer primitiven Typen"

Leider gibt es in der Java-Plattform nichts, was dies tut. Übrigens müssen Sie auch explizit null Elemente im Array Integer[] (was int werden Sie für diese verwenden?).

Apache Commons Lang ist wieder dein Freund. Sie bieten ArrayUtils.toPrimitive (), das genau das tut, was Sie brauchen. Sie können angeben, wie Sie Nullen behandeln möchten.

Mit in Java 8 eingeführten Streams kann dies getan werden:

 int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray(); 

Derzeit gibt es jedoch nur primitive Streams für int , long und double . Wenn Sie zu einem anderen primitiven Typ wie byte konvertieren müssen, ist der kürzeste Weg ohne eine externe Bibliothek:

 byte[] byteArray = new byte[array.length]; for(int i = 0; i < array.length; i++) byteArray[i] = array[i]; 

Oder die for-Schleife kann durch einen Stream ersetzt werden, wenn Sie möchten:

 IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]); 

Alle diese Elemente werden eine NullPointerException wenn eines Ihrer Elemente null .

Guava verwenden :

 int[] intArray = Ints.toArray(Arrays.asList(array)); 

Dokumentation:

  • Arrays.asList (core-API)
  • Ints.toArray (Guave)

Dies kann insbesondere erfolgen, ohne dass ein neues Array erstellt und der Inhalt durchlaufen werden muss.

Sie können ein Array von Integer nicht in int konvertieren (dh Sie können den Typ der Elemente eines Arrays nicht ändern) in Java. Sie müssen also entweder ein neues int [] – Array erstellen und den Wert der Integer-Objekte darin kopieren oder einen Adapter verwenden:

 class IntAdapter { private Integer[] array; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index].intValue(); } } 

Dies kann Ihren Code ein wenig lesbarer machen und das IntAdapter-Objekt wird nur ein paar Bytes Speicher belegen. Der große Vorteil eines Adapters ist, dass Sie hier Sonderfälle behandeln können:

 class IntAdapter { private Integer[] array; public int nullValue = 0; public IntAdapter (Integer[] array) { this.array = array; } public int get (int index) { return array[index] == null ? nullValue : array[index].intValue(); } } 

Eine andere Lösung besteht darin, Commons Primitives zu verwenden, die viele vordefinierte Adapter enthalten. In Ihrem Fall sehen Sie sich ListIntList an .

Oder machen Sie es einfach, wenn Sie es nur einmal tun. Aber Sie haben nicht über Integer! = Null gesprochen.

  //array is the Integer array int[] array2 = new int[array.length]; int i=0; for (Integer integer : array) { array2[i] = integer.intValue(); i++; } 

mit Dollar ist einfach wie:

 Integer[] array = ...; int[] primitiveArray = $(array).toIntArray();