Dalam JDK 8 dengan lambda b93 ada kelas java.util.stream.Streams.zip di b93 yang dapat digunakan untuk zip stream (ini diilustrasikan dalam tutorial Menjelajahi Java8 Lambdas. Bagian 1 oleh Dhananjay Nene ). Fungsi ini:
Membuat aliran gabungan malas dan berurutan yang unsur-unsurnya adalah hasil dari menggabungkan unsur-unsur dari dua aliran.
Namun pada b98 ini telah menghilang. Infact Streams
kelas bahkan tidak dapat diakses di java.util.stream di b98 .
Apakah fungsi ini telah dipindahkan, dan jika demikian bagaimana cara zip stream secara ringkas menggunakan b98?
Aplikasi yang ada dalam pikiran saya adalah dalam implementasi java dari Shen , di mana saya mengganti fungsi zip di
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
fungsi dengan kode yang agak verbose (yang tidak menggunakan fungsionalitas dari b98).
Jawaban:
Saya membutuhkan ini juga jadi saya hanya mengambil kode sumber dari b93 dan memasukkannya ke dalam kelas "util". Saya harus memodifikasinya sedikit agar berfungsi dengan API saat ini.
Untuk referensi, inilah kode kerjanya (ambil risiko Anda sendiri ...):
sumber
SIZED
jika salah satu aliranSIZED
, bukan keduanya?SIZED
implementasi ini berfungsi. Ini sebenarnya tergantung pada bagaimana Anda mendefinisikan zipping. Haruskah Anda dapat meng-zip dua aliran dengan ukuran yang berbeda, misalnya? Seperti apa aliran yang dihasilkan nantinya? Saya percaya inilah mengapa fungsi ini sebenarnya dihilangkan dari API. Ada banyak cara untuk melakukan ini dan terserah kepada pengguna untuk memutuskan perilaku apa yang harus menjadi "benar". Apakah Anda akan membuang elemen dari aliran yang lebih panjang atau mengisi daftar yang lebih pendek? Jika demikian, dengan nilai apa?Spliterator<A>
).zip adalah salah satu fungsi yang disediakan oleh perpustakaan protonpack .
sumber
Jika Anda memiliki Guava di proyek Anda, Anda dapat menggunakan metode Streams.zip (ditambahkan dalam Guava 21):
sumber
Zip dua aliran menggunakan JDK8 dengan lambda ( inti ).
sumber
import java.util.function.*;
danimport java.util.stream.*;
di atas file Anda.() -> iterator
dan di sini lagi:iterable.spliterator()
. Mengapa tidak menerapkan langsungSpliterator
daripadaIterator
? Periksa @Doradus jawab stackoverflow.com/a/46230233/1140754Karena saya tidak bisa membayangkan penggunaan zip pada koleksi selain yang diindeks (Daftar) dan saya penggemar berat kesederhanaan, ini akan menjadi solusi saya:
sumber
mapToObject
seharusnya begitumapToObj
.RandomAccess
(misalnya pada daftar tertaut) ini akan sangat lambatMetode kelas yang Anda sebutkan telah dipindahkan ke
Stream
antarmuka itu sendiri yang mendukung metode default. Tetapi tampaknyazip
metode ini telah dihapus. Mungkin karena tidak jelas apa perilaku default untuk aliran ukuran yang berbeda seharusnya. Tetapi menerapkan perilaku yang diinginkan sangat mudah:sumber
predicate
Anda lulus ke filter stateful ? Itu melanggar kontrak metode dan terutama tidak akan berfungsi saat memproses aliran secara paralel.Saya dengan rendah hati menyarankan implementasi ini. Aliran yang dihasilkan dipotong ke yang lebih pendek dari dua aliran input.
sumber
.., leftStream.isParallel() || rightStream.isParallel()
. Saya pikir itu tidak berpengaruh karenaAbstractSpliterator
menawarkan paralelisme terbatas secara default. Jadi saya pikir hasil akhirnya akan sama dengan passingfalse
.Perpustakaan Lazy-Seq menyediakan fungsionalitas zip.
https://github.com/nurkiewicz/LazySeq
Perpustakaan ini sangat terinspirasi oleh
scala.collection.immutable.Stream
dan bertujuan untuk menyediakan implementasi urutan lazy yang tidak berubah, aman dan mudah digunakan, mungkin tak terbatas.sumber
Menggunakan perpustakaan Guava terbaru (untuk
Streams
kelas) yang harus Anda lakukansumber
Apakah ini akan berhasil untuk Anda? Ini adalah fungsi pendek, yang dengan malas mengevaluasi aliran yang zip, sehingga Anda dapat menyediakannya dengan aliran yang tak terbatas (tidak perlu mengambil ukuran aliran yang di-zip).
Jika aliran terbatas, ia berhenti segera setelah salah satu aliran kehabisan elemen.
Berikut adalah beberapa kode uji unit (lebih lama dari kode itu sendiri!)
sumber
takeWhile
pada akhirnya adalah yang tampaknya tidak berada di java8 tetapi itu tidak masalah karena callee dapat menyaring nol yang terjadi ketika zip zip bukan ukuran yang sama. Saya pikir jawaban ini harus menjadi jawaban nomor 1 karena terdiri dan dapat dimengerti. kerja bagus terima kasih lagi.sumber
Siklus-reaksi AOL , yang saya sumbangkan, juga menyediakan fungsionalitas zipping, baik melalui implementasi Stream yang diperluas , yang juga mengimplementasikan antarmuka reaktif-aliran ReactiveSeq, dan melalui StreamUtils yang menawarkan banyak fungsi yang sama melalui metode statis ke standar Java Streams.
Ini juga menawarkan zip berbasis Aplikasi yang lebih umum. Misalnya
Dan bahkan kemampuan untuk memasangkan setiap item dalam satu aliran dengan setiap item dalam yang lain
sumber
Jika ada yang membutuhkan ini, ada
StreamEx.zipWith
fungsi di perpustakaan streamex :sumber
Ini bagus. Saya harus memasukkan dua aliran ke dalam Peta dengan satu aliran menjadi kunci dan lainnya menjadi nilainya
Output: {A = Apple, B = Banana, C = Wortel}
sumber