Odpowiedzi:
Możesz użyć Arrays.stream np
Arrays.stream(array);
Możesz także użyć, Stream.of
jak wspomniał @fge, który wygląda jak
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Ale uwaga Stream.of(intArray)
zwróci, Stream<int[]>
podczas gdy Arrays.stream(intArr)
zwróci pod IntStream
warunkiem, że przekażesz tablicę typu int[]
. Zatem w skrócie dla typów prymitywnych można zaobserwować różnicę między 2 metodami np
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Po przekazaniu tablicy pierwotnej do Arrays.stream
wywoływany jest następujący kod
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
a po przekazaniu tablicy pierwotnej do Stream.of
następującego kodu jest wywoływana
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Dlatego otrzymujesz różne wyniki.
Zaktualizowano : Jak wspomniał komentarz Stuarta Marksa Przeciążenie podzakresu Arrays.stream
jest lepsze niż używanie, Stream.of(array).skip(n).limit(m)
ponieważ pierwszy daje strumień SIZED, podczas gdy drugi nie. Powodem jest to, że limit(m)
nie wie, czy rozmiar jest m, czy mniejszy niż m, podczas Arrays.stream
gdy sprawdza zakres i zna dokładny rozmiar strumienia.Możesz odczytać kod źródłowy implementacji strumienia zwracany Arrays.stream(array,start,end)
tutaj , podczas gdy dla implementacji strumienia zwracanego przez Stream.of(array).skip().limit()
jest w ramach tej metody .
Stream.of
może dać ci kilka niespodzianek (na przykład, gdy dzwonisz Arrays.asList
z prymitywną tablicą i ludzie oczekują List<Integer>
odwrotu) :-)
Arrays.stream
obsługuje przesyłanie strumieniowe zakresu tablicy, co IntStream.of
nie. W przeciwieństwie do tego, Stream.of
jest to lepszy wybór, jeśli chcesz mieć Stream<int[]>
rozmiar 1
…
Arrays.stream
jest lepsze niż użycie, Stream.of(array).skip(n).limit(m)
ponieważ pierwszy daje strumień SIZED, a drugi nie. Powodem jest to, że limit(m)
nie wie, czy rozmiar jest, m
czy mniejszy niż m
, podczas Arrays.stream
gdy sprawdza zakres i zna dokładny rozmiar strumienia.
Arrays.stream(array,start,end)
zwraca a, Stream
którego implementacja jest tutaj , natomiast Stream.of(array).skip().limit()
zwraca a, Stream
której implementacja znajduje się w tej metodzie .
Alternatywa dla rozwiązania @ sol4me:
Stream.of(theArray)
Różnica między this i Arrays.stream()
: ma znaczenie, jeśli twoja tablica jest typu pierwotnego. Na przykład, jeśli:
Arrays.stream(someArray)
gdzie someArray
jest a long[]
, zwróci LongStream
. Stream.of()
z drugiej strony zwróci a Stream<long[]>
z jednym elementem.
Arrays.stream()
do tego działa
*Stream.of()
gdy masz do Arrays.stream()
czynienia z prymitywnymi tablicami. A jeśli chodzi o tablice, które nie są rzeczywistymi obiektami, cóż, to jest Java, tak było od wersji 1.0, więc zajmij się tym; rozmyślanie nad tym nic nie pomaga
Arrays.stream()
nie jest to wygodne, uważam to za wygodne. Wystarczająco powiedziane.
*Stream.of()
jest wygodniejszy, gdy jest fałszywy; bo to kwestia preferencji . Preferuję Arrays.stream()
takie przypadki, co sprawia, że z reguły Stream.of()
jest to błędne, co jest wygodniejsze (algebra Peano).
Stream.of("foo", "bar", "baz")
Lub, jeśli masz już tablicę, możesz to zrobić
Stream.of(array)
W przypadku typów pierwotnych użyj IntStream.of
lub LongStream.of
itp.
int[]
można przekazać metodę akceptującą varargs, dlaczego nie Stream.of(intArray)
utworzy Stream<Integer>
zamiast Stream<int[]>
? Czy jest też jakieś techniczne uzasadnienie, dlaczego istnieją wyspecjalizowane klasy Stream dla prymitywów?
int[]
nie jest jak inne tablice. To nie jest podklasa klasy Object[]
, ale jest to podklasa klasy Object
. Tak więc, kiedy przekazujesz go do Stream.of
, jest przyjmowany jako Object
parametr, i otrzymujesz strumień int[]
. Jest to jeden z powodów, dla których warto mieć wyspecjalizowane klasy dla prymitywów - gdybyś nie tworzył strumieni z prymitywnych tablic, byłoby to dość bolesne. Innym powodem jest to, że specjalistyczne zajęcia są bardziej efektywne, ponieważ nie trzeba ponosić Object
narzut z boksu (konwersja int
do Integer
, aby wyglądać jak zwykłe obiekty).
int[]
jest Object
, to pasowałoby do przeciążonej metody of(T t)
i dlatego zwraca Stream<int[]>
. Czyli teoretycznie, gdyby ta metoda nie była dostępna, otrzymalibyśmy Stream<Integer>
w zamian? a może skutkuje to błędem kompilacji, ponieważ nie może znaleźć pasującej metody? tj. int[]
nie można traktować jakoT...
Stream<Integer>
tego, ponieważ Stream.of(t ... T)
nadal pasowalibyśmy w ten sam sposób.
Można to zrobić również metodą niskopoziomową z opcją równoległą:
/**
* 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)
Możesz użyć Arrays.stream:
Arrays.stream (tablica);
Zapewnia to typ zwracany pary na podstawie typu array wejście, jeśli jej String []
następnie powrócić Stream<String>
, jeśli int []
następnie powracaIntStream
Jeśli znasz już tablicę typów wejściowych, dobrze jest użyć konkretnej tablicy, takiej jak typ wejściowy int[]
IntStream.of (tablica);
To zwraca Intstream.
W pierwszym przykładzie Java używa metody overloading
do znalezienia określonej metody na podstawie typów danych wejściowych, podczas gdy w drugim znasz już typ danych wejściowych i wywołujesz określoną metodę.
Arrays.stream
zawiera wszystkie przeciążone przypadki dla tablic pierwotnych. To znaczy,Stream.of(new int[]{1,2,3})
że da ci,Stream<int[]>
podczas gdyArrays.stream
zwróci ci to,IntStream
co prawdopodobnie jest tym, czego chcesz. Więc +1