Próbuję przekonwertować ArrayList zawierającą obiekty Integer na pierwotne int [] za pomocą następującego fragmentu kodu, ale generuje błąd czasu kompilacji. Czy można konwertować w Javie?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
java
arrays
arraylist
primitive-types
Snehal
źródło
źródło
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
Odpowiedzi:
Możesz konwertować, ale nie sądzę, że jest coś wbudowanego, aby to zrobić automatycznie:
(Pamiętaj, że spowoduje to zgłoszenie wyjątku NullPointerException, jeśli jest w nim którykolwiek
integers
lub jakikolwiek elementnull
.)EDYCJA: Jak na komentarze, możesz użyć iteratora listy, aby uniknąć nieprzyjemnych kosztów z listami takimi jak
LinkedList
:źródło
integers.stream().mapToInt(Integer::valueOf).toArray
Jeśli używasz java-8 jest też inny sposób, aby to zrobić.
Co to robi:
Stream<Integer>
z listyIntStream
poprzez mapowanie każdego elementu do siebie (funkcja tożsamości), rozpakowywanieint
wartości przechowywanej przez każdy elementInteger
obiekt (wykonywane automatycznie od Java 5)int
przez wywołanietoArray
Można również jawnie wywołać
intValue
za pomocą odwołania do metody, tj .:Warto również wspomnieć, że możesz dostać,
NullPointerException
jeśli masz jakieśnull
odniesienia na liście. Można tego łatwo uniknąć, dodając warunek filtrowania do potoku strumienia w następujący sposób:Przykład:
źródło
double
typów; czy nie ma odpowiedników dlafloat
typów?Google Guava
Google Guava zapewnia dobry sposób na to, dzwoniąc
Ints.toArray
.źródło
Apache Commons ma klasę ArrayUtils, która ma metodę toPrimitive (), która właśnie to robi.
Jednak, jak pokazał Jon, dość łatwo jest to zrobić samemu, zamiast korzystać z zewnętrznych bibliotek.
źródło
Uważam, że iterowanie przy użyciu iteratora listy jest lepszym pomysłem, ponieważ
list.get(i)
może mieć niską wydajność w zależności od implementacji listy:źródło
korzystanie z Dollara powinno być dość proste:
Planuję ulepszyć DSL, aby usunąć
toArray()
połączenie pośrednieźródło
Działa mi to dobrze :)
Znalezione na https://www.techiedelight.com/convert-list-integer-array-int/
źródło
Zaskakuje mnie, że zachęcamy do jednorazowych niestandardowych metod, gdy doskonale dobra, dobrze używana biblioteka, taka jak Apache Commons, już rozwiązała problem. Chociaż rozwiązanie jest trywialne, jeśli nie absurdalne, nieodpowiedzialne jest zachęcanie do takiego zachowania ze względu na długoterminową konserwację i dostępność.
Po prostu idź z Apache Commons
źródło
Jeśli używasz kolekcji Eclipse , możesz użyć tej
collectInt()
metody, aby przełączyć się z kontenera obiektów na pierwotny kontener int.Jeśli możesz przekonwertować swój
ArrayList
naFastList
, możesz pozbyć się adaptera.Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse.
źródło
Java 8:
źródło
Arrays.setAll ()
Wynik:
Te same prace na tablicy
long
lubdouble
, ale nie dla tablicboolean
,char
,byte
,short
lubfloat
. Jeśli masz naprawdę ogromną listę, istnieje nawetparallelSetAll
metoda, której możesz użyć zamiast tego.Dla mnie jest to dobre i wystarczająco elokwentne, że nie chciałbym mieć biblioteki zewnętrznej ani używać do niej strumieni.
Link do dokumentacji:
Arrays.setAll(int[], IntUnaryOperator)
źródło
Możesz po prostu skopiować go do tablicy:
Niezbyt fantazyjne; ale hej, to działa ...
źródło
Bardzo proste jedno-liniowe rozwiązanie to:
źródło
Ten segment kodu działa dla mnie, spróbuj tego:
Warto wspomnieć, że ArrayList należy zadeklarować w następujący sposób:
źródło
źródło
dostęp
arr
jak zwykleint[]
.źródło