Saat ini setiap kali saya perlu membuat aliran dari array, saya lakukan
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Apakah ada cara langsung untuk membuat streaming dari array?
sumber
Saat ini setiap kali saya perlu membuat aliran dari array, saya lakukan
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Apakah ada cara langsung untuk membuat streaming dari array?
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 .
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 +1Stream.of
bisa memberi Anda beberapa kejutan (seperti ketika Anda meneleponArrays.asList
dengan array primitif dan bahwa orang mengharapkanList<Integer>
kembali) :-)Arrays.stream
mendukung streaming berbagai array, yangIntStream.of
tidak. Sebaliknya,Stream.of
adalah pilihan yang lebih baik jika Anda ingin suatuStream<int[]>
ukuran1
...Arrays.stream
lebih disukai untuk digunakanStream.of(array).skip(n).limit(m)
karena yang sebelumnya menghasilkan aliran SIZED sedangkan yang terakhir tidak. Alasannya adalah bahwalimit(m)
tidak tahu apakah ukurannyam
atau kurang dari itum
, sedangkanArrays.stream
rentang melakukan pengecekan dan mengetahui ukuran persis aliran.Arrays.stream(array,start,end)
kembalilahStream
yang implementasinya ada di sini , sedangkanStream.of(array).skip().limit()
pengembalianStream
yang implementasinya ada dalam metode ini .Alternatif solusi @ sol4me:
Perbedaan antara ini dan
Arrays.stream()
: itu tidak membuat perbedaan jika array adalah tipe primitif. Misalnya, jika Anda melakukannya:dimana
someArray
along[]
, itu akan mengembalikan aLongStream
.Stream.of()
, di sisi lain, akan mengembalikan aStream<long[]>
dengan elemen tunggal.sumber
Arrays.stream()
bekerja untuk itu juga*Stream.of()
saat AndaArrays.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 membantuArrays.stream()
tidak nyaman, saya anggap nyaman. Cukup kata.*Stream.of()
lebih nyaman untuk menyesatkan; karena ini masalah preferensi . Saya lebih sukaArrays.stream()
untuk kasus-kasus seperti itu, yang membuatnya salah sebagai aturan umum yangStream.of()
lebih nyaman (aljabar Peano).Atau, jika Anda sudah memiliki array, Anda juga bisa melakukannya
Untuk tipe primitif gunakan
IntStream.of
atauLongStream.of
dll.sumber
int[]
dapat diteruskan ke metode menerima varargs, mengapa tidak akanStream.of(intArray)
menghasilkan yangStream<Integer>
bukanStream<int[]>
? Juga, apakah ada alasan teknis mengapa ada kelas Stream khusus untuk primitif?int[]
tidak seperti array lainnya. Ini bukan subkelas dariObject[]
, tetapi merupakan subkelas dariObject
. Jadi, ketika Anda meneruskannyaStream.of
, itu diambil sebagaiObject
parameter, dan Anda mendapatkan aliranint[]
. 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 dikenakanObject
biaya overhead dari tinju (mengkonversiint
untukInteger
agar terlihat seperti objek normal).int[]
merupakanObject
, itu akan cocok dengan metode kelebihan bebanof(T t)
dan karenanya kembaliStream<int[]>
. Jadi, secara teori, jika metode ini tidak tersedia, kita akan mendapatkanStream<Integer>
imbalannya? atau mungkin itu menghasilkan kesalahan kompilasi karena tidak dapat menemukan metode yang cocok? yaituint[]
tidak dapat diperlakukan sebagaiT...
Stream<Integer>
itu, karenaStream.of(t ... T)
masih akan cocok dengan cara yang sama.Anda dapat membuatnya juga dengan metode level rendah yang memiliki opsi paralel:
Pembaruan: Gunakan full array.length (tidak panjang - 1).
sumber
Anda dapat menggunakan Arrays.stream:
Ini memastikan tipe pengembalian steam berdasarkan pada tipe input array Anda jika
String []
kemudian kembaliStream<String>
, jikaint []
kemudian kembaliIntStream
Ketika Anda sudah tahu tipe input array maka bagus untuk menggunakan yang spesifik seperti untuk tipe input
int[]
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.sumber
jarang terlihat, tetapi ini adalah cara yang paling langsung
sumber