Jawaban:
Anda dapat menggunakan Arrays.stream Eg
Arrays.stream(array);
Anda juga dapat menggunakan Stream.of
seperti yang disebutkan oleh @fge, yang terlihat seperti
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Tetapi note Stream.of(intArray)
akan kembali Stream<int[]>
sedangkan Arrays.stream(intArr)
akan kembali IntStream
asalkan Anda melewati array tipe int[]
. Jadi singkatnya untuk tipe primitif Anda dapat mengamati perbedaan antara 2 metode Misalnya
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Ketika Anda meneruskan array primitif ke Arrays.stream
, kode berikut dipanggil
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
dan ketika Anda meneruskan array primitif ke Stream.of
kode berikut dipanggil
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Karenanya Anda mendapatkan hasil yang berbeda.
Diperbarui : Seperti yang disebutkan oleh komentar Stuart Marks Kelebihan subrange Arrays.stream
lebih disukai untuk digunakan Stream.of(array).skip(n).limit(m)
karena yang pertama menghasilkan aliran SIZED sedangkan yang kedua tidak. Alasannya adalah bahwa limit(m)
tidak tahu apakah ukurannya m atau kurang dari m, sedangkan Arrays.stream
apakah rentang memeriksa dan mengetahui ukuran aliran yang tepat. Anda dapat membaca kode sumber untuk implementasi aliran yang dikembalikan oleh Arrays.stream(array,start,end)
sini , sedangkan untuk implementasi aliran yang dikembalikan oleh Stream.of(array).skip().limit()
adalah dalam metode ini .
Stream.of
bisa memberi Anda beberapa kejutan (seperti ketika Anda menelepon Arrays.asList
dengan array primitif dan bahwa orang mengharapkan List<Integer>
kembali) :-)
Arrays.stream
mendukung streaming berbagai array, yang IntStream.of
tidak. Sebaliknya, Stream.of
adalah pilihan yang lebih baik jika Anda ingin suatu Stream<int[]>
ukuran 1
...
Arrays.stream
lebih disukai untuk digunakan Stream.of(array).skip(n).limit(m)
karena yang sebelumnya menghasilkan aliran SIZED sedangkan yang terakhir tidak. Alasannya adalah bahwa limit(m)
tidak tahu apakah ukurannya m
atau kurang dari itu m
, sedangkan Arrays.stream
rentang melakukan pengecekan dan mengetahui ukuran persis aliran.
Arrays.stream(array,start,end)
kembalilah Stream
yang implementasinya ada di sini , sedangkan Stream.of(array).skip().limit()
pengembalian Stream
yang implementasinya ada dalam metode ini .
Alternatif solusi @ sol4me:
Stream.of(theArray)
Perbedaan antara ini dan Arrays.stream()
: itu tidak membuat perbedaan jika array adalah tipe primitif. Misalnya, jika Anda melakukannya:
Arrays.stream(someArray)
dimana someArray
a long[]
, itu akan mengembalikan a LongStream
. Stream.of()
, di sisi lain, akan mengembalikan a Stream<long[]>
dengan elemen tunggal.
Arrays.stream()
bekerja untuk itu juga
*Stream.of()
saat Anda Arrays.stream()
berhadapan dengan array primitif. Dan untuk array tidak menjadi objek nyata, yah, ini adalah Java, ini telah terjadi sejak 1.0 jadi hadapi itu; merenung tentang ini tidak membantu
Arrays.stream()
tidak nyaman, saya anggap nyaman. Cukup kata.
*Stream.of()
lebih nyaman untuk menyesatkan; karena ini masalah preferensi . Saya lebih suka Arrays.stream()
untuk kasus-kasus seperti itu, yang membuatnya salah sebagai aturan umum yang Stream.of()
lebih nyaman (aljabar Peano).
Stream.of("foo", "bar", "baz")
Atau, jika Anda sudah memiliki array, Anda juga bisa melakukannya
Stream.of(array)
Untuk tipe primitif gunakan IntStream.of
atau LongStream.of
dll.
int[]
dapat diteruskan ke metode menerima varargs, mengapa tidak akan Stream.of(intArray)
menghasilkan yang Stream<Integer>
bukan Stream<int[]>
? Juga, apakah ada alasan teknis mengapa ada kelas Stream khusus untuk primitif?
int[]
tidak seperti array lainnya. Ini bukan subkelas dari Object[]
, tetapi merupakan subkelas dari Object
. Jadi, ketika Anda meneruskannya Stream.of
, itu diambil sebagai Object
parameter, dan Anda mendapatkan aliran int[]
. Itulah salah satu alasan untuk memiliki kelas khusus untuk primitif - jika Anda tidak membuat aliran dari array primitif akan sangat menyakitkan. Alasan lain, adalah bahwa kelas khusus yang lebih efisien, karena tidak perlu dikenakan Object
biaya overhead dari tinju (mengkonversi int
untuk Integer
agar terlihat seperti objek normal).
int[]
merupakan Object
, itu akan cocok dengan metode kelebihan beban of(T t)
dan karenanya kembali Stream<int[]>
. Jadi, secara teori, jika metode ini tidak tersedia, kita akan mendapatkan Stream<Integer>
imbalannya? atau mungkin itu menghasilkan kesalahan kompilasi karena tidak dapat menemukan metode yang cocok? yaitu int[]
tidak dapat diperlakukan sebagaiT...
Stream<Integer>
itu, karena Stream.of(t ... T)
masih akan cocok dengan cara yang sama.
Anda dapat membuatnya juga dengan metode level rendah yang memiliki opsi paralel:
/**
* 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)
Anda dapat menggunakan Arrays.stream:
Arrays.stream (array);
Ini memastikan tipe pengembalian steam berdasarkan pada tipe input array Anda jika String []
kemudian kembali Stream<String>
, jika int []
kemudian kembaliIntStream
Ketika Anda sudah tahu tipe input array maka bagus untuk menggunakan yang spesifik seperti untuk tipe input int[]
IntStream.of (array);
Ini mengembalikan Intstream.
Dalam contoh pertama, Java menggunakan metode overloading
untuk menemukan metode spesifik berdasarkan tipe input sedangkan seperti pada kedua Anda sudah tahu jenis input dan memanggil metode tertentu.
Arrays.stream
memiliki semua kasus kelebihan untuk array primitif. YaituStream.of(new int[]{1,2,3})
akan memberi AndaStream<int[]>
sedangkanArrays.stream
akan memberi Anda kembaliIntStream
yang mungkin apa yang Anda inginkan. Jadi +1