Niemand hat bisher in Java 8 hinzugefügte Streams erwähnt, also hier ist es:
int[] example1 = list.stream().mapToInt(i->i).toArray();
// OR
int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();
Denkprozess:
Das Einfache Stream#toArray gibt ein zurück Object[] Array, also ist es nicht das, was wir wollen. Ebenfalls, Stream#toArray(IntFunction<A[]> generator) tut nicht, was wir wollen, weil der generische Typ A kann den primitiven Typ nicht darstellen int
Es wäre also schön, einen Stream zu haben, der mit dem primitiven Typ umgehen könnte int anstelle der Verpackung Integerweil es toArray -Methode wird höchstwahrscheinlich auch eine zurückgeben int[] array (gibt etwas anderes zurück wie Object[] oder sogar verpackt Integer[] wäre hier unnatürlich). Und zum Glück hat Java 8 einen solchen Stream, der ist IntStream
Jetzt müssen wir nur noch herausfinden, wie wir unsere umwandeln Stream<Integer> (was zurückgegeben wird von list.stream()) zu diesem glänzenden IntStream. Hier die Stream#mapToInt(ToIntFunction<? super T> mapper) Methode kommt zur Rettung. Alles, was wir tun müssen, ist, ihm ein Mapping von zu übergeben Integer zu int.
Wir könnten so etwas gebrauchen Integer#intValue was ein zurückgibt int Wie nachfolgend dargestellt:
mapToInt( (Integer i) -> i.intValue() )
(oder einige mögen es vorziehen: mapToInt(Integer::intValue).)
Aber ähnlicher Code kann mit Unboxing generiert werden, da der Compiler weiß, dass das Ergebnis dieses Lambda vom Typ sein muss int (das verwendete Lambda in mapToInt ist eine Implementierung der ToIntFunction Schnittstelle, die als Körper eine Methode des Typs erwartet: int applyAsInt(T value) die voraussichtlich eine zurückgeben wird int).
Wir können also einfach schreiben:
mapToInt((Integer i)->i)
Auch seit dem Integer eintippen (Integer i) kann vom Compiler abgeleitet werden, weil List<Integer>#stream() gibt a zurück Stream<Integer>wir können es auch überspringen, was uns übrig lässt
mapToInt(i -> i)
Ganz klar die beste Lösung. Schade, dass es an Erklärungen mangelt.
– Pimp Trizkit
26. November 2015 um 14:53 Uhr
@PimpTrizkit Diese Antwort wurde ein wenig aktualisiert. Hoffe es ist jetzt klarer.
– Pschemo
26. November 2015 um 15:32 Uhr
@Pshemo – Danke! Ich persönlich brauchte keine Erklärung. Aber ich hasse es, die perfekte Antwort ohne eine zu sehen! Unabhängig davon hat mich Ihre Erklärung aufgeklärt und war hilfreich. Ich frage mich, warum die mapTo... Funktionen nicht zulassen null lambda …. wie sort …. was es standardmäßig zu einem Standardverhalten macht … in diesem Fall i -> i wäre ein perfektes Standardverhalten.
– Pimp Trizkit
27. November 2015 um 3:29 Uhr
Ich denke, diese Antwort ist schneller als ColinDs Antwort mit Guava, oder?
– vefthym
2. März 2017 um 10:47 Uhr
@vefthym Ich habe es nicht getestet, aber ich vermute, dass beide Lösungen nach demselben einfachen Prinzip funktionieren, sodass ich eine ähnliche Geschwindigkeit erwarten würde (aber Sie können es gerne als Benchmark verwenden). Ein Vorteil dieser Antwort ist, dass keine zusätzlichen Bibliotheken erforderlich sind, solange wir Java 8 haben.
– Pschemo
2. März 2017 um 15:55 Uhr
Leider glaube ich da nicht wirklich ist eine bessere Möglichkeit, dies zu tun, da Java primitive Typen, Boxing, Arrays und Generika handhabt. Bestimmtes:
List<T>.toArray funktioniert nicht, weil es keine Konvertierung von gibt Integer zu int
Sie können nicht verwenden int als Typargument für Generika, so würde es verfügen über ein … sein int-spezifische Methode (oder eine, die Reflexion verwendet, um böse Tricks zu machen).
Ich glaube, es gibt Bibliotheken, die automatisch generierte Versionen dieser Art von Methode für alle primitiven Typen haben (dh es gibt eine Vorlage, die für jeden Typ kopiert wird). Es ist hässlich, aber ich fürchte, es ist so 🙁
Obwohl die Arrays Klasse herauskam, bevor Generika in Java ankamen, müsste sie immer noch all die schrecklichen Überladungen enthalten, wenn sie heute eingeführt würde (vorausgesetzt, Sie wollen primitive Arrays verwenden).
Siehe auch ColinDs Antwort zu Guavas Ints.toArray(Collection)
– Ron
16. Juni 2011 um 12:34 Uhr
@JonSkeet du meinst wie die schrecklichen Überladungen, die bereits in der Arrays-Klasse vorhanden sind binarySearch, copyOf, copyOfRange…? Ich frage mich, warum sie nicht einen weiteren Satz schrecklicher Überladungen hinzufügen konnten.
– Simon Forsberg
24. Mai 2013 um 20:30 Uhr
Die Antwort von @ron ColinD gibt nichts anderes als das, was das OP bereits hatte – For-Schleife zum Füllen eines primitiven Arrays mit einem nicht primitiven.
– Tomáš Zato – Wiedereinsetzung von Monica
6. März 2015 um 19:47 Uhr
Inzwischen sind Java-Ingenieure bei Oracle darauf fixiert, die Sprache mit Modulen zu verkomplizieren …
– Gubatron
17. Februar 2016 um 20:41 Uhr
@bvdb: Ich sage, dass es ohne andere Bibliotheken (die im Grunde immer noch die Schleife haben, aber in ihrem Code nicht Ihren) keinen besseren Ansatz gibt. Das ist eine deutlich stärkere Behauptung als zu sagen, ich weiß nicht, ob es einen besseren Ansatz gibt oder nicht.
List<Integer> list = ...
int[] ints = Ints.toArray(list);
Dies erspart Ihnen die zwischenzeitliche Array-Konvertierung, die das Commons Lang-Äquivalent selbst erfordert.
Leider ist das Zwischenarray in Guava versteckt: Object[] boxedArray = collection.toArray();
– kamczak
25. Februar 2014 um 12:05 Uhr
“Glücklicherweise ist die Zwischenreihe in Guava versteckt.” – Das wurde für Sie behoben. 😉
– Erbaut
5. August 2016 um 21:03 Uhr
Eddi
Der einfachste Weg, dies zu tun, ist die Verwendung von Apache Commons Lang. Es hat eine praktische ArrayUtils-Klasse, die tun kann, was Sie wollen. Verwenden Sie die toPrimitive -Methode mit der Überladung für ein Array von IntegerS.
List<Integer> myList;
... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));
So erfindet man das Rad nicht neu. Commons Lang hat sehr viele nützliche Dinge, die Java weggelassen hat. Oben habe ich mich entschieden, eine Integer-Liste der richtigen Größe zu erstellen. Sie können auch ein statisches Integer-Array der Länge 0 verwenden und Java ein Array der richtigen Größe zuweisen lassen:
static final Integer[] NO_INTS = new Integer[0];
....
int[] intArray2 = ArrayUtils.toPrimitive(myList.toArray(NO_INTS));
Pumpenhaus
Java 8 hat uns eine einfache Möglichkeit gegeben, dies über Streams zu tun …
Verwendung der Sammlungen stream() -Funktion und dann auf ints abbilden, erhalten Sie einen IntStream. Mit dem IntStream wir können toArray() aufrufen, was uns gibt int []
int [] ints = list.stream().mapToInt(Integer::intValue).toArray();
int[] toIntArray(List<Integer> list) {
int[] ret = new int[list.size()];
int i = 0;
for (Integer e : list)
ret[i++] = e;
return ret;
}
Leichte Änderung an Ihrem Code, um eine teure Listenindizierung zu vermeiden (da eine Liste nicht unbedingt eine ArrayList ist, sondern eine verkettete Liste sein könnte, für die wahlfreier Zugriff teuer ist)
Noor Nawaz
Hier ist Java 8 einzeiliger Code dafür
public int[] toIntArray(List<Integer> intList){
return intList.stream().mapToInt(Integer::intValue).toArray();
}
10020300cookie-checkWie kann ich List konvertieren zu int[] auf Java? [duplicate]yes
Sie können nur in Integer umwandeln[] durch die Nutzung:
Integer[] arr = (Integer[])list.toArray(new Integer[list.size]);
– Fest codiert
5. Juli 2010 um 15:48 Uhr
@Hardcoded Möglicherweise möchten Sie Ihren Kommentar bearbeiten, um die Methode list.size() zu verwenden und die unnötige Umwandlung zu löschen.
– saktiw
9. April 2013 um 16:10 Uhr
Gibt es eine bessere Möglichkeit, dies jetzt in Java 8 zu tun?
– Makoto
16. Juni 2014 um 0:14 Uhr
(@Makoto: siehe Pshemos Antwort)
– Graubart
9. Februar 2016 um 19:11 Uhr
int[] arr = listOfIntegers.stream().mapToInt(x->x).toArray();
– old_soul_on_the_run
22. September 2018 um 23:49 Uhr