Momentan, wenn ich Stream aus einem Array erstellen muss, mache ich das
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
verwenden, wie von @fge erwähnt, was so aussieht
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Beachten Sie jedoch, dass Stream.of(intArray)
Stream<int[]>
zurückgibt, während Arrays.stream(intArr)
IntStream
zurückgibt, sofern Sie ein Array vom Typ int[]
übergeben. Kurz gesagt, für Primitivtypen können Sie 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 Arrays.stream
übergeben, 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
übergeben, wird der folgende Code aufgerufen
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Dadurch erhalten Sie unterschiedliche Ergebnisse.
Aktualisiert : Wie von Stuart Marks comment Die Überladung des Unterbereichs von Arrays.stream
ist der Verwendung vorzuziehen Stream.of(array).skip(n).limit(m)
weil der erstere zu einem SIZED-Stream führt, der letztere jedoch nicht. Der Grund ist, dass limit(m)
nicht weiß, ob die Größe m oder kleiner als m ist, während Arrays.stream
die Bereichsprüfung durchführt und die genaue Größe des Streams kennt. Sie können den Quellcode für den Stream lesen Implementierung zurückgegeben von Arrays.stream(array,start,end)
here , wohingegen für die von Stream.of(array).skip().limit()
zurückgegebene Stream-Implementierung innerhalb von this method liegt.
Alternative zur Lösung von @ sol4me:
Stream.of(theArray)
Der Unterschied zwischen diesem und Arrays.stream()
: it do macht einen Unterschied, wenn Ihr Array einen primitiven Typ hat. Wenn Sie zum Beispiel:
Arrays.stream(someArray)
wenn someArray
ein long[]
ist, wird eine LongStream
zurückgegeben. Stream.of()
liefert dagegen einen Stream<long[]>
mit einem einzelnen Element.
Stream.of("foo", "bar", "baz")
Wenn Sie bereits über ein Array verfügen, können Sie dies auch tun
Stream.of(array)
Für primitive Typen verwenden Sie IntStream.of
oder LongStream.of
usw.
Sie können Arrays.stream verwenden:
String []
dannStream<String>
zurückgegeben wird, wennint []
dannIntStream
Wenn Sie bereits das Eingabetyp-Array kennen, ist es gut, ein bestimmtes Array wie für den Eingabetyp
int[]
zu verwenden.overloading
, um eine bestimmte Methode basierend auf den Eingabetypen zu finden, während Sie wie in der zweiten bereits den Eingabetyp und die aufrufspezifische Methode kennen.
Sie können es auch durch eine Low-Level-Methode mit paralleler Option machen:
/**
* 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)