Jeśli masz tablicę obiektów Java, które mają typ pierwotny (na przykład Byte, Integer, Char itp.). Czy istnieje zgrabny sposób na przekształcenie go w tablicę typu pierwotnego? W szczególności można to zrobić bez konieczności tworzenia nowej tablicy i przeglądania zawartości w pętli.
Na przykład dane
Integer[] array
jaki jest najładniejszy sposób przekształcenia tego w
int[] intArray
Niestety jest to coś, co musimy robić dość często, gdy łączymy się między Hibernate a niektórymi bibliotekami stron trzecich, nad którymi nie mamy kontroli. Wygląda na to, że byłaby to dość powszechna operacja, więc byłbym zaskoczony, gdyby nie było skrótu.
Dzięki za pomoc!
źródło
Po raz kolejny Apache Commons Lang jest twoim przyjacielem. Zapewniają ArrayUtils.toPrimitive (), który robi dokładnie to, czego potrzebujesz. Możesz określić, jak chcesz obsługiwać wartości null.
źródło
W przypadku strumieni wprowadzonych w Javie 8 można to zrobić:
int[] intArray = Arrays.stream(array).mapToInt(Integer::intValue).toArray();
Jednakże, istnieje obecnie tylko dla prymitywnych strumienie
int
,long
idouble
. Jeśli chcesz przekonwertować na inny typ pierwotny, taki jakbyte
najkrótszy sposób bez zewnętrznej biblioteki, to:byte[] byteArray = new byte[array.length]; for(int i = 0; i < array.length; i++) byteArray[i] = array[i];
Jeśli chcesz, pętlę for można zastąpić strumieniem:
IntStream.range(0, array.length).forEach(i -> byteArray[i] = array[i]);
Wszystkie te rzucą,
NullPointerException
jeśli którykolwiek z twoich elementównull
.źródło
Integer::intValue
możesz również użyći -> i
(który używa rozpakowywania).Integer::intValue
, więc po co tworzyć nową lambdę, skoro metoda jest łatwo dostępna?int[] ints = Arrays.stream(objects).mapToInt(i -> Integer.parseInt(i.toString())).toArray();
Mam nadzieję, że jest to pomocne dla każdego, kto ma ten sam problem. A jeśli ktoś zna lepszy sposób, daj mi znać.Korzystanie z guawy :
int[] intArray = Ints.toArray(Arrays.asList(array));
Dokumentacja:
Arrays.asList
(Podstawowy interfejs API)Ints.toArray
(Guawa)źródło
Nie możesz przekonwertować tablicy typu Integer na int (tj. Nie możesz 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(); } }
Może to uczynić twój kod bardziej czytelnym, a obiekt IntAdapter będzie zużywał tylko kilka bajtów pamięci. Dużą zaletą adaptera jest to, że poradzisz sobie tutaj ze specjalnymi przypadkami:
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 .
źródło
Lub po prostu zrób to w łatwy sposób, jeśli chcesz to zrobić tylko raz. Ale nie rozmawiał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++; }
źródło
korzystanie z dolara jest proste, jak:
Integer[] array = ...; int[] primitiveArray = $(array).toIntArray();
źródło
$
! Nie wydaje mi się jednak, żeby to było zachęcane…