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!
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?).
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.
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
.
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:
-
Arrays.asList
(Core API) -
Ints.toArray
(guawa)
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.
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++;
}
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
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