Antworten:
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 .
Stream.of
gewissem Sinne könnte es Ihnen einige Überraschungen Arrays.asList
List<Integer>
Arrays.stream
unterstützt das Streaming eines Bereichs des Arrays, was IntStream.of
nicht der Fall ist. Im Gegensatz dazu Stream.of
ist die bessere Wahl , wenn Sie wollen eine Stream<int[]>
Größe 1
...
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, dass limit(m)
nicht bekannt ist, ob die Größe m
kleiner oder kleiner ist m
, während Arrays.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ährend Stream.of(array).skip().limit()
a zurückgegeben wird, Stream
dessen Implementierung innerhalb dieser Methode liegt .
Alternative zur Lösung von @ sol4me:
Stream.of(theArray)
Der Unterschied zwischen diesem und Arrays.stream()
: Es macht einen Unterschied, ob Ihr Array vom primitiven Typ ist. Wenn Sie zum Beispiel Folgendes tun:
Arrays.stream(someArray)
Wo someArray
ist ein long[]
, wird es ein zurückgeben LongStream
. Stream.of()
Auf der anderen Seite wird a Stream<long[]>
mit einem einzelnen Element zurückgegeben.
Arrays.stream()
funktioniert auch dafür
*Stream.of()
wenn Sie Arrays.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über
Arrays.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 bevorzuge Arrays.stream()
solche Fälle, was es in der Regel Stream.of()
bequemer macht (Peano-Algebra).
Stream.of("foo", "bar", "baz")
Wenn Sie bereits ein Array haben, können Sie dies auch tun
Stream.of(array)
Für primitive Typen verwenden Sie IntStream.of
oder LongStream.of
etc.
int[]
auf ein Verfahren weitergegeben werden varargs akzeptieren, warum nicht Stream.of(intArray)
produzieren einen Stream<Integer>
statt Stream<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 von Object[]
, aber es ist eine Unterklasse von Object
. Wenn Sie es an übergeben Stream.of
, wird es als Object
Parameter verwendet und Sie erhalten einen Stream von int[]
. 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 keinen Object
Overhead durch das Boxen verursachen müssen (Konvertieren int
in Integer
, damit es wie normale Objekte aussieht).
int[]
es eine ist Object
, würde es mit der überladenen Methode übereinstimmen of(T t)
und daher zurückgeben Stream<int[]>
. Wenn diese Methode theoretisch nicht verfügbar wäre, hätten wir die Stream<Integer>
Gegenleistung erhalten? oder führt dies möglicherweise zu einem Kompilierungsfehler, weil die passende Methode nicht gefunden werden konnte? dh int[]
kann nicht behandelt werden alsT...
Stream<Integer>
, weil wir immer Stream.of(t ... T)
noch genauso zusammenpassen würden.
Sie können es auch mit einer Low-Level-Methode machen, die eine parallele Option hat:
/**
* Creates a new sequential or parallel {@code Stream} from a
* {@code Spliterator}.
*
* <p>The spliterator is only traversed, split, or queried for estimated
* size after the terminal operation of the stream pipeline commences.
*
* @param <T> the type of stream elements
* @param spliterator a {@code Spliterator} describing the stream elements
* @param parallel if {@code true} then the returned stream is a parallel
* stream; if {@code false} the returned stream is a sequential
* stream.
* @return a new sequential or parallel {@code Stream}
*
* <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
*/
StreamSupport.stream(Arrays.spliterator(array, 0, array.length), true)
Sie können Arrays.stream verwenden:
Arrays.stream (Array);
Dies stellt sicher, dass der Rückgabetyp von Dampf basierend auf Ihrem Array-Eingabetyp ist, wenn er String []
dann zurückkehrt Stream<String>
, wenn er int []
dann zurückkehrtIntStream
Wenn Sie das Array des Eingabetyps bereits kennen, sollten Sie ein bestimmtes Array wie für den Eingabetyp verwenden int[]
IntStream.of (Array);
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.
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 +1