Konwertowanie tablicy obiektów do tablicy ich prymitywnych typów

Jeśli masz tablicę obiektów Java, które mają prymitywny typ (na przykład Byte, Integer, Char, itp.). Czy jest jakiś fajny sposób na przekształcenie go w tablicę typu prymitywnego? W szczególności można to zrobić bez konieczności tworzenia nowej tablicy i pętli przez zawartość.

Więc na przykład, biorąc pod uwagę

Integer[] array

Jaki jest najlepszy sposób na przekształcenie tego w

int[] intArray

Niestety, jest to coś, co musimy robić dość często, gdy między Hibernate i niektóre biblioteki stron trzecich, nad którymi nie mamy kontroli. Wydaje się, że byłaby to dość powszechna operacja, więc byłbym zaskoczony, gdyby nie było skrótu.

Dzięki za pomoc!

Author: informatik01, 2009-02-19

7 answers

Niestety, w platformie Java nic takiego nie robi. Btw, musisz również jawnie obsłużyć null elementy w tablicy Integer[] (czego int będziesz używać do tych elementów?).

 33
Author: Zach Scrivena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 08:37:31

Po raz kolejny, Apache Commons Lang jest twoim przyjacielem. Zapewniają ArrayUtils.toPrimitive () , która robi dokładnie to, czego potrzebujesz. Możesz określić, w jaki sposób chcesz obsługiwać null.

 82
Author: Guillaume,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 21:24:44

Ze strumieniami wprowadzonymi w Javie 8 można to zrobić:

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

Jednak obecnie istnieją tylko prymitywne strumienie dla int, long i double. Jeśli chcesz przekonwertować na inny prymitywny Typ, taki jak byte, najkrótsza droga bez zewnętrznej biblioteki jest następująca:

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

Lub pętla for Może być zastąpiona strumieniem, jeśli chcesz:

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

Wszystkie z nich rzucą NullPointerException, jeśli któryś z Twoich elementów jest null.

 50
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 15:51:56

Użycie Guawa:

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

Dokumentacja:

 22
Author: Paul Bellora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-26 17:22:46

W szczególności można to zrobić bez konieczności tworzenia nowej tablicy i pętli przez zawartość.

Nie można przekonwertować tablicy liczb całkowitych na int (tzn. nie można zmienić typu elementów tablicy) w Javie. Więc albo musisz utworzyć nową tablicę int [] i skopiować do niej wartość obiektów Integer, albo możesz użyć adaptera:

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

To może sprawić, że Twój kod będzie bardziej czytelny, a obiekt IntAdapter pochłonie tylko kilka bajtów pamięci. Dużą zaletą adaptera jest to, że możesz obsługiwać specjalne przypadki tutaj:

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();
    }
}

Innym rozwiązaniem jest użycie Commons Primitives , który zawiera wiele predefiniowanych adapterów. W Twoim przypadku spójrz na ListIntList.

 3
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 08:41:46

Albo zrób to w prosty sposób, jeśli zrobisz to tylko raz. Ale nie mówiłeś o Integer!= null case.

    //array is the Integer array
    int[] array2 = new int[array.length];
    int i=0;
    for (Integer integer : array) {
        array2[i] = integer.intValue();
        i++;
    }
 2
Author: Jens Jansson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 08:46:38

Użycie jest proste jak:

Integer[] array = ...;
int[] primitiveArray = $(array).toIntArray();
 1
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-01 20:17:47