it-swarm.com.de

Wie kann ich einen Stream aus einem Array erstellen?

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?

121
adam.kubi

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.

190
sol4me

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.

41
fge
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.

13
Dima

Sie können Arrays.stream verwenden:

String [] dann Stream<String> zurückgegeben wird, wenn int [] dann IntStream 

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. 

0
vipul patel

Sie können es auch durch eine Low-Level-Methode mit paralleler Option machen:

Update: Verwenden Sie full array.length (nicht length - 1).

/** 
 * 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)
0
merqlove