Ich habe versucht, ein int-Array in List zu konvertieren, bin den ungewohnten Weg der Verwendung von Java 8 Stream gegangen und habe mir das ausgedacht
Arrays.stream(arr).boxed().collect(Collectors.toList());
Ich habe immer noch Schwierigkeiten, diese Zeile vollständig zu verstehen.
Warum wird
Collectors.toList()
in diesem Fall eineArrayList<Integer>
Implementierungsschnittstelle zurückgegebenList
? Warum nichtLinkedList<Integer>
oder eine andere generische Klasse, die derList
Schnittstelle entspricht? Ich kann nichts darüber finden, außer eine kurze Erwähnung von ArrayList hier im Abschnitt API-Hinweise.Was bedeutet das linke Feld ? Offensichtlich ist der generische Rückgabetyp ( in meinem Code hier). Und ich denke, ist das generische Typargument der Methode, aber wie werden sie angegeben? Ich habe in das Collector- Interface-Dokument geschaut und konnte es nicht aufnehmen.
Stream.collect()
R
ArrayList<Integer>
<R, A>
R
ist der generische Typ des resultierenden Typs.A
der generische Typ des Zwischenakkumulationstyps des Collectors. Dies ist ein Implementierungsdetail für die Funktionsweise eines Kollektors. Er teilt und erobert, auch für die parallele Verarbeitung, und sammelt zuerst in Zwischentypen.Collectors.toList()
in diesem Fall ein zurückgegeben?ArrayList<Integer>
" Möglicherweise wird kein zurückgegebenArrayList
. DieList
Implementierung ist undefiniert , sodass Sie sich nicht darauf verlassen können, welche Implementierung zurückgegeben wird. Wie der Javadoc sagt: "Es gibt keine Garantien für den Typ , die Veränderlichkeit, die Serialisierbarkeit oder die Thread-Sicherheit der zurückgegebenen Liste."toList()
gibt keinArrayList
oder zurückList
- es gibt ein zurückCollector
, das schließlich ein erstellt und zurückgibtList
- auch in der Dokumentation heißt es: "... Es gibt keine Garantien für den Typ , die Veränderlichkeit, die Serialisierbarkeit oder die Thread-Sicherheit der zurückgegebenen Liste; Wenn mehr Kontrolle über die zurückgegebene Liste erforderlich ist, verwenden Sie toCollection (Lieferant) .... "Antworten:
Es ist eine Standardimplementierung.
ArrayList
wird verwendet, weil es in den meisten Anwendungsfällen am besten ist. Wenn es jedoch nicht für Sie geeignet ist, können Sie jederzeit Ihren eigenen Sammler definieren und die Fabrik nach IhrenCollection
Wünschen bereitstellen :Ja,
A
undR
sind generische Parameter dieser Methode,R
ist der Rückgabetyp,T
ist der Eingabetyp undA
ist ein Zwischentyp, der während des gesamten Prozesses des Sammelns von Elementen auftritt (möglicherweise nicht sichtbar und betrifft diese Funktion nicht). Der Anfang vonCollector
's Javadoc definiert diese Typen (sie sind im gesamten Dokument konsistent):quelle
List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());
Methoden halten und nur Methoden aufrufen, die in der List-Schnittstelle auf myList deklariert sind. Andernfalls würde ich mich möglicherweise einem Risiko aussetzen, wenn Oracle beschließt, die Standardimplementierung in Java8u1024 oder 15 zu ändern.List
Implementierung ist das Verhalten also dasselbe. Es ist unwahrscheinlich, dass die Benutzeroberfläche in neueren Versionen von Java geändert wird.Wie aus der Methodendefinition hervorgeht, wird eine Collector-Implementierung mit dem Collector-Lieferanten as zurückgegeben
ArrayList
. Aus der nachstehenden Methodendefinition geht daher sehr deutlich hervor, dassCollectors.toList
ArrayList collector (While it's arguable why toList not toArrayList word is used in method name
) immer zurückgegeben wird.<R, A> R collect(Collector<? super T, A, R> collector)
MittelsWenn Sie sich auf Dokumentationskommentare beziehen, werden diese generischen Typen genau erwähnt:
quelle
Collectors.toList()
(erstes Snippet)? Ist es openjdk?