Apakah mungkin untuk melakukan streaming di Java 8? Katakanlah saya memiliki daftar objek, saya dapat melakukan sesuatu seperti ini untuk menyaring semua objek tambahan:
Stream.of(objects).filter(c -> c instanceof Client)
Namun setelah ini, jika saya ingin melakukan sesuatu dengan klien saya akan perlu masing-masing:
Stream.of(objects).filter(c -> c instanceof Client)
.map(c -> ((Client) c).getID()).forEach(System.out::println);
Ini terlihat agak jelek. Apakah mungkin untuk mengalirkan seluruh aliran ke jenis yang berbeda? Seperti dilemparkan Stream<Object>
ke Stream<Client>
?
Abaikan fakta bahwa melakukan hal-hal seperti ini mungkin akan berarti desain yang buruk. Kami melakukan hal-hal seperti ini di kelas ilmu komputer saya, jadi saya mencari fitur-fitur baru java 8 dan ingin tahu apakah ini mungkin.
java
java-8
java-stream
Fiksi
sumber
sumber
Jawaban:
Saya tidak berpikir ada cara untuk melakukan itu di luar kotak. Solusi yang mungkin lebih bersih adalah:
atau, seperti yang disarankan dalam komentar, Anda dapat menggunakan
cast
metode ini - yang pertama mungkin lebih mudah dibaca:sumber
map
mengirimkannya ke Klien akan mengembalikan aStream<Client>
. Terima kasih!Stream.of(objects).filter(Client.class::isInstance).[...]
Sejalan dengan jawaban ggovan , saya melakukan ini sebagai berikut:
Menggunakan fungsi pembantu ini:
sumber
Terlambat ke pesta, tapi kupikir itu jawaban yang berguna.
flatMap
akan menjadi cara terpendek untuk melakukannya.Jika
o
aClient
maka buat Stream dengan elemen tunggal, jika tidak gunakan aliran kosong. Aliran ini kemudian akan diratakan menjadi aStream<Client>
.sumber
if/else
daripada?:
operator maka tidak akan ada peringatan. Yakinlah Anda dapat dengan aman menekan peringatan.Stream.of(objects).filter(o->o instanceof Client).map(o -> (Client)o)
atau bahkanStream.of(objects).filter(Client.class::isInstance).map(Client.class::cast)
.Tidak, itu tidak mungkin. Ini bukan hal baru di Java 8. Ini khusus untuk obat generik. A
List<Object>
bukan tipe superList<String>
, jadi Anda tidak bisa hanya memberikanList<Object>
aList<String>
.Serupa adalah masalah di sini. Anda tidak dapat melemparkan
Stream<Object>
keStream<Client>
. Tentu saja Anda dapat melemparkannya secara tidak langsung seperti ini:tapi itu tidak aman, dan mungkin gagal saat runtime. Alasan yang mendasari hal ini adalah, obat generik di Jawa diimplementasikan menggunakan erasure. Jadi, tidak ada informasi jenis yang tersedia tentang jenis
Stream
itu saat runtime. Semuanya adilStream
.BTW, apa yang salah dengan pendekatan Anda? Terlihat baik untuk saya.
sumber
C#
diimplementasikan menggunakan reifikasi, sedangkan di Jawa, diimplementasikan menggunakan penghapusan. Keduanya diimplementasikan dalam berbagai mode yang mendasarinya. Jadi, Anda tidak dapat mengharapkannya bekerja dengan cara yang sama di kedua bahasa.