Derzeit mache ich es immer dann, wenn ich einen Stream aus einem Array erstellen muss
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Gibt es eine direkte Möglichkeit, einen Stream aus einem Array zu erstellen?
quelle
Derzeit mache ich es immer dann, wenn ich einen Stream aus einem Array erstellen muss
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Gibt es eine direkte Möglichkeit, einen Stream aus einem Array zu erstellen?
Sie können Arrays.stream verwenden, z
Arrays.stream(array);
Sie können auch Stream.of
wie von @fge erwähnt verwenden, wie es aussieht
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Note Stream.of(intArray)
wird jedoch zurückgegeben, Stream<int[]>
während Arrays.stream(intArr)
wird zurückgegeben, IntStream
sofern Sie ein Array vom Typ übergeben int[]
. Kurz gesagt, Sie können den Unterschied zwischen zwei Methoden beobachten, z
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Wenn Sie ein primitives Array an übergeben Arrays.stream
, wird der folgende Code aufgerufen
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
und wenn Sie ein primitives Array an Stream.of
den folgenden Code übergeben, wird dieser aufgerufen
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Daher erhalten Sie unterschiedliche Ergebnisse.
Aktualisiert : Wie von Stuart Marks Kommentar erwähnt. Die Überlastung des Unterbereichs von Arrays.stream
ist der Verwendung vorzuziehen, Stream.of(array).skip(n).limit(m)
da erstere zu einem SIZED-Stream führt, während letztere dies nicht tut. Der Grund ist, dasslimit(m)
nicht bekannt ist, ob die Größe m oder kleiner als m ist, während Arrays.stream
der Bereich prüft und die genaue Größe des Streams kennt. Sie können den Quellcode für die von Arrays.stream(array,start,end)
hier zurückgegebene Stream-Implementierung lesen , während für die von zurückgegebene Stream-Implementierung Stream.of(array).skip().limit()
is innerhalb dieser Methode .
Arrays.stream
alle überladenen Fälle für primitive Arrays vorliegen. DhStream.of(new int[]{1,2,3})
ich werde dir eine geben,Stream<int[]>
während du eine zurückgebenArrays.stream
wirst,IntStream
was wahrscheinlich das ist, was du willst. Also +1Stream.of
gewissem Sinne könnte es Ihnen einige ÜberraschungenArrays.asList
List<Integer>
Arrays.stream
unterstützt das Streaming eines Bereichs des Arrays, wasIntStream.of
nicht der Fall ist. Im Gegensatz dazuStream.of
ist die bessere Wahl , wenn Sie wollen eineStream<int[]>
Größe1
...Arrays.stream
ist der Verwendung vorzuziehen,Stream.of(array).skip(n).limit(m)
da erstere zu einem SIZED-Stream führt, während letztere dies nicht tut. Der Grund dafür ist, dasslimit(m)
nicht bekannt ist, ob die Größem
kleiner oder kleiner istm
, währendArrays.stream
der Bereich die genaue Größe des Streams überprüft und kennt.Arrays.stream(array,start,end)
a zurückgegeben,Stream
dessen Implementierung hier ist , währendStream.of(array).skip().limit()
a zurückgegeben wird,Stream
dessen Implementierung innerhalb dieser Methode liegt .Alternative zur Lösung von @ sol4me:
Der Unterschied zwischen diesem und
Arrays.stream()
: Es macht einen Unterschied, ob Ihr Array vom primitiven Typ ist. Wenn Sie zum Beispiel Folgendes tun:Wo
someArray
ist einlong[]
, wird es ein zurückgebenLongStream
.Stream.of()
Auf der anderen Seite wird aStream<long[]>
mit einem einzelnen Element zurückgegeben.quelle
Arrays.stream()
funktioniert auch dafür*Stream.of()
wenn SieArrays.stream()
mit primitiven Arrays arbeiten. Und was Arrays betrifft, die keine realen Objekte sind, so ist dies Java. Dies ist seit 1.0 der Fall. darüberArrays.stream()
es für nicht bequem, ich halte es für bequem. Genug gesagt.*Stream.of()
bequemer, um trügerisch zu sein; weil es eine Frage der Vorlieben ist . Ich bevorzugeArrays.stream()
solche Fälle, was es in der RegelStream.of()
bequemer macht (Peano-Algebra).Wenn Sie bereits ein Array haben, können Sie dies auch tun
Für primitive Typen verwenden Sie
IntStream.of
oderLongStream.of
etc.quelle
int[]
auf ein Verfahren weitergegeben werden varargs akzeptieren, warum nichtStream.of(intArray)
produzieren einenStream<Integer>
stattStream<int[]>
? Gibt es auch technische Gründe, warum es spezielle Stream-Klassen für Grundelemente gibt?int[]
ist nicht wie andere Arrays. Es ist keine Unterklasse vonObject[]
, aber es ist eine Unterklasse vonObject
. Wenn Sie es an übergebenStream.of
, wird es alsObject
Parameter verwendet und Sie erhalten einen Stream vonint[]
. Dies ist einer der Gründe, spezielle Klassen für primitive Arrays zu haben. Wenn Sie keine Streams aus primitiven Arrays erstellen würden, wäre dies ziemlich schmerzhaft. Der andere Grund ist, dass spezialisierte Klassen effizienter sind, da sie keinenObject
Overhead durch das Boxen verursachen müssen (Konvertierenint
inInteger
, damit es wie normale Objekte aussieht).int[]
es eine istObject
, würde es mit der überladenen Methode übereinstimmenof(T t)
und daher zurückgebenStream<int[]>
. Wenn diese Methode theoretisch nicht verfügbar wäre, hätten wir dieStream<Integer>
Gegenleistung erhalten? oder führt dies möglicherweise zu einem Kompilierungsfehler, weil die passende Methode nicht gefunden werden konnte? dhint[]
kann nicht behandelt werden alsT...
Stream<Integer>
, weil wir immerStream.of(t ... T)
noch genauso zusammenpassen würden.Sie können es auch mit einer Low-Level-Methode machen, die eine parallele Option hat:
Update: Verwenden Sie die volle array.length (nicht length - 1).
quelle
Sie können Arrays.stream verwenden:
Dies stellt sicher, dass der Rückgabetyp von Dampf basierend auf Ihrem Array-Eingabetyp ist, wenn er
String []
dann zurückkehrtStream<String>
, wenn erint []
dann zurückkehrtIntStream
Wenn Sie das Array des Eingabetyps bereits kennen, sollten Sie ein bestimmtes Array wie für den Eingabetyp verwenden
int[]
Dies gibt Intstream zurück.
Im ersten Beispiel verwendet Java eine Methode
overloading
, um eine bestimmte Methode basierend auf Eingabetypen zu finden, während Sie im zweiten Beispiel bereits den Eingabetyp kennen und eine bestimmte Methode aufrufen.quelle
selten gesehen, aber dies ist der direkteste Weg
quelle