Saya tahu tidak ada padanan langsung di Java itu sendiri, tapi mungkin pihak ketiga?
Ini sangat nyaman. Saat ini saya ingin menerapkan iterator yang menghasilkan semua node dalam pohon, yaitu sekitar lima baris kode dengan hasil.
java
yield
yield-return
ripper234
sumber
sumber
Jawaban:
Dua opsi yang saya tahu adalah pustaka koleksi infomancers Aviad Ben Dov dari 2007 dan pustaka YieldAdapter Jim Blackler dari 2008 (yang juga disebutkan dalam jawaban lain).
Keduanya akan memungkinkan Anda untuk menulis kode dengan
yield return
konstruksi -seperti di Java, jadi keduanya akan memenuhi permintaan Anda. Perbedaan penting antara keduanya adalah:Mekanika
Perpustakaan Aviad menggunakan manipulasi bytecode sementara Jim menggunakan multithreading. Tergantung pada kebutuhan Anda, masing-masing mungkin memiliki kelebihan dan kekurangannya sendiri. Sepertinya solusi Aviad lebih cepat, sedangkan Jim lebih portabel (misalnya, menurut saya perpustakaan Aviad tidak akan berfungsi di Android).
Antarmuka
Perpustakaan Aviad memiliki antarmuka yang lebih bersih - berikut contohnya:
Sementara Jim jauh lebih rumit, membutuhkan Anda untuk
adept
generikCollector
yang memilikicollect(ResultHandler)
metode ... ugh. Namun, Anda dapat menggunakan sesuatu seperti pembungkus ini di sekitar kode Jim dengan Informasi Zoom yang sangat menyederhanakan itu:Lisensi
Solusi Aviad adalah BSD.
Solusi Jim adalah domain publik, begitu juga pembungkusnya yang disebutkan di atas.
sumber
AbstractIterator
.yield(i)
akan berhenti pada JDK 13, karenayield
ditambahkan sebagai pernyataan Java baru / kata kunci yang dipesan.Kedua pendekatan ini dapat dibuat sedikit lebih bersih sekarang Java memiliki Lambdas. Anda bisa melakukan sesuatu seperti
Saya menjelaskan lebih banyak di sini.
sumber
Yielderable
? Bukankah seharusnya begituYieldable
? (kata kerjanya hanya 'hasil', bukan 'yielder' atau 'yielderate' atau apa pun)yield -> { ... }
akan rusak pada JDK 13, karenayield
ditambahkan sebagai pernyataan Java baru / kata kunci yang dipesan.Saya tahu ini pertanyaan yang sangat lama di sini, dan ada dua cara yang dijelaskan di atas:
yield
yang jelas memiliki biaya sumber daya.Namun, ada cara lain, yang ketiga dan mungkin yang paling alami, untuk mengimplementasikan
yield
generator di Java yang merupakan implementasi yang paling dekat dengan apa yang dilakukan oleh compiler C # 2.0+ untukyield return/break
pembuatan: lombok-pg . Ini sepenuhnya didasarkan pada mesin negara, dan membutuhkan kerja sama yang eratjavac
untuk memanipulasi kode sumber AST. Sayangnya, dukungan lombok-pg sepertinya dihentikan (tidak ada aktivitas repositori selama lebih dari satu atau dua tahun), dan Project Lombok yang asli sayangnya tidak memilikiyield
fitur (memiliki IDE yang lebih baik seperti Eclipse, namun dukungan IntelliJ IDEA).sumber
Stream.iterate (seed, seedOperator) .limit (n) .foreach (action) tidak sama dengan operator hasil, tetapi mungkin berguna untuk menulis generator Anda sendiri dengan cara ini:
sumber
Saya juga menyarankan jika Anda sudah menggunakan RXJava dalam proyek Anda untuk menggunakan Observable sebagai "yielder". Ini dapat digunakan dengan cara yang sama jika Anda membuat Observable Anda sendiri.
Observable dapat diubah menjadi iterator sehingga Anda bahkan dapat menggunakannya dalam for loop yang lebih tradisional. RXJava juga memberi Anda alat yang sangat kuat, tetapi jika Anda hanya membutuhkan sesuatu yang sederhana maka mungkin ini akan berlebihan.
sumber
Saya baru saja menerbitkan solusi lain (berlisensi MIT) di sini , yang meluncurkan produsen di utas terpisah, dan menyiapkan antrean terbatas antara produsen dan konsumen, memungkinkan penyanggaan, kontrol aliran, dan pemipaan paralel antara produsen dan konsumen (jadi bahwa konsumen dapat bekerja untuk memakan barang sebelumnya sementara produsen bekerja untuk memproduksi barang berikutnya).
Anda dapat menggunakan formulir kelas dalam anonim ini:
sebagai contoh:
Atau Anda dapat menggunakan notasi lambda untuk mengurangi boilerplate:
sumber