Untuk mendapatkan sintaks kueri LINQ lengkap, Anda perlu memperbarui spesifikasi bahasa dan kompiler yang mendukung kata kunci dan struktur sintaksis baru. Ini jauh melampaui kebanyakan pembaca di sini.
Untuk mendapatkan sintaks rantai-metode Linq seperti di Jawa yang terlihat dan berfungsi seperti apa yang ada di C #, Anda memerlukan dua hal yang tidak didukung Java; metode ekstensi (metode statis yang dapat diterapkan ke instance seolah-olah itu adalah metode instance), dan ekspresi lambda (delegasi anonim). Namun, keduanya dapat dipalsukan dengan konstruk Java yang ada, jika Anda bersedia mengeluarkan sedikit tambahan kata sandi pengkodean. Satu hal yang saya temukan sangat mengagumkan tentang Java adalah kemampuan untuk membuat implementasi antarmuka anonim; diterapkan pada antarmuka dengan fungsi murni tunggal, yang pada dasarnya memungkinkan delegasi anonim sederhana, asalkan Anda memiliki antarmuka untuk setiap metode tanda tangan yang Anda perlukan.
Jadi, sisi IEnumerable (Iterable for the Javaheads) dari Linq, sebagai rantai metode, harus dapat diperkirakan di Jawa; Anda pada dasarnya akan mengimplementasikannya sebagai antarmuka yang lancar yang mengontrol monad. Anda memerlukan kelas seperti LinqIterable, mengimplementasikan Iterable, yang:
dapat mengonversi input Iterable apa pun menjadi instance LinqIterable
memiliki metode untuk pemrosesan daftar dasar, seperti pemfilteran, pengelompokan, penggabungan, persimpangan, pemesanan, dll yang menerima antarmuka fungsi tunggal dan menghasilkan LinqIterables baru, memungkinkan rangkaian metode ini, semoga dengan cara "malas".
memiliki metode untuk mengubah kembali LinqIterable menjadi objek "konkret" seperti ToList, ToArray, ToMap, dll
Jadi, Anda mungkin bisa mendefinisikan pustaka "fasih" yang memungkinkan pernyataan seperti:
Pembuatan perpustakaan yang sebenarnya adalah latihan yang jauh melampaui lingkup jawaban di T&J internet. Saya hanya mengatakan itu mungkin, tidak mudah.
Pohon ekspresi bukanlah ilmu roket, tetapi itu akan menjadi proyek yang signifikan untuk mengimplementasikan apa yang dimiliki oleh .NET di bidang ini; Anda tidak hanya memerlukan kemampuan untuk membangun pohon ekspresi, Anda harus dapat "mengkompilasi" pohon ini dengan cepat menggunakan bytecodes yang dipancarkan; Saya tidak tahu apakah refleksi Java cukup kuat.
Lucunya metode ekstensi dan ekspresi lambda keduanya di Jawa 8. Mungkin LINQ sedang dalam perjalanan?
Lxs
4
Nah jika Anda memiliki metode ekstensi dan lambda, Anda memiliki sisi "Enumerable" dari. Linq .NET tanpa upaya besar. Masih akan, seperti yang saya katakan, memerlukan perubahan ke spesifikasi Java untuk memungkinkan kata kunci yang membuat kueri Linq, tetapi jujur dalam penggunaan Linq sehari-hari saya belum menemukan terlalu banyak kueri yang tidak semudah itu. dinyatakan sebagai rantai metode, dan kompiler cukup banyak mengubah sintaks Linq ke rantai metode (ada plugin VS yang dapat mengkonversi 1: 1 antara sebagian besar kueri dan rantai). Batu loncatan nyata berikutnya adalah pohon ekspresi (Queryable Linq).
/programming/346721/linq-for-java-tool - Ada disebutkan bahwa sebelum Java 8 Anda juga dapat menggunakan koleksi Google untuk memalsukannya dan bahwa Scala bahasa memang mendukungnya sebagai fitur bahasa, ( Scala adalah bahasa populer lainnya di JVM).
maukah Anda memperluas sedikit tentang apa yang masing-masing sumber daya miliki dan mengapa Anda merekomendasikan ini sebagai menjawab pertanyaan yang diajukan? "Jawaban khusus tautan" tidak diterima di Stack Exchange
agas
Hmm, saya kira itu adalah kasus bahwa Q ini sudah dijawab - harus diubah sebagai duplikat?
Martijn Verburg
1
@ MartijnVerburg - kami tidak dapat menandai pertanyaan sebagai duplikat di seluruh situs. Jawaban benar-benar harus bisa berdiri sendiri.
ChrisF
Diedit, semoga sedikit lebih bermanfaat sekarang.
Martijn Verburg
5
Tidak. Linq membutuhkan banyak fitur bahasa yang hanya dimiliki oleh Java
Scala tidak memasukkan sesuatu seperti Linq tanpa perpustakaan.
Jonas
1
@Jonas: Jadi? Java tidak menyertakan Linq dengan pustaka.
back2dos
@ back2dos: Ya, itu sebabnya Anda harus menjawab dengan perpustakaan.
Jonas
1
@Jonas: Pustaka standar Scala seperti LINQ. Atau sebaliknya: LINQ hanyalah sekumpulan idiom pemrograman fungsional untuk C #. Lebih lanjut tentang itu di sini .
back2dos
@ back2dos: Terima kasih atas tautannya, saya mengambil kebebasan untuk memasukkannya.
Landei
2
Saya akan menambahkan jambu ke daftar perpustakaan yang dapat membantu Anda mencapai beberapa hal yang dilakukan LINQ.
Tetapi seperti yang telah ditunjukkan orang lain, tidak ada padanan di Jawa murni.
maukah Anda menjelaskan lebih lanjut tentang apa yang dilakukannya dan mengapa Anda merekomendasikannya untuk menjawab pertanyaan yang diajukan? "Jawaban khusus tautan" tidak diterima di Stack Exchange
agas
2
Anda bisa menggunakan Korma , sebuah DSL untuk query SQL yang ditulis dalam Clojure.
Sintaksnya cukup rapi:
(select user
(with address)(fields :firstName :lastName :address.state)(where {:email "[email protected]"}))
Anda dapat memanggil ini dengan mudah dari Jawa dengan mengimpor pustaka Clojure yang relevan dan hanya menggunakan interop Clojure / Java normal.
Misalkan kita memiliki objek Hewan yang berisi nama dan ID yang diwakili dengan daftar animals. Jika kita ingin mendapatkan semua nama Hewan yang berisi 'o' dari daftar animals, kita dapat menulis kueri berikut
Saya takut kehilangan kedua jenis statis memeriksa dan memeriksa keberadaan anggota kelas adalah sedikit curam harga untuk panggilan seperti where("getName", ...).
Jawaban:
Untuk mendapatkan sintaks kueri LINQ lengkap, Anda perlu memperbarui spesifikasi bahasa dan kompiler yang mendukung kata kunci dan struktur sintaksis baru. Ini jauh melampaui kebanyakan pembaca di sini.
Untuk mendapatkan sintaks rantai-metode Linq seperti di Jawa yang terlihat dan berfungsi seperti apa yang ada di C #, Anda memerlukan dua hal yang tidak didukung Java; metode ekstensi (metode statis yang dapat diterapkan ke instance seolah-olah itu adalah metode instance), dan ekspresi lambda (delegasi anonim). Namun, keduanya dapat dipalsukan dengan konstruk Java yang ada, jika Anda bersedia mengeluarkan sedikit tambahan kata sandi pengkodean. Satu hal yang saya temukan sangat mengagumkan tentang Java adalah kemampuan untuk membuat implementasi antarmuka anonim; diterapkan pada antarmuka dengan fungsi murni tunggal, yang pada dasarnya memungkinkan delegasi anonim sederhana, asalkan Anda memiliki antarmuka untuk setiap metode tanda tangan yang Anda perlukan.
Jadi, sisi IEnumerable (Iterable for the Javaheads) dari Linq, sebagai rantai metode, harus dapat diperkirakan di Jawa; Anda pada dasarnya akan mengimplementasikannya sebagai antarmuka yang lancar yang mengontrol monad. Anda memerlukan kelas seperti
LinqIterable
, mengimplementasikan Iterable, yang:Jadi, Anda mungkin bisa mendefinisikan pustaka "fasih" yang memungkinkan pernyataan seperti:
Pembuatan perpustakaan yang sebenarnya adalah latihan yang jauh melampaui lingkup jawaban di T&J internet. Saya hanya mengatakan itu mungkin, tidak mudah.
Pohon ekspresi bukanlah ilmu roket, tetapi itu akan menjadi proyek yang signifikan untuk mengimplementasikan apa yang dimiliki oleh .NET di bidang ini; Anda tidak hanya memerlukan kemampuan untuk membangun pohon ekspresi, Anda harus dapat "mengkompilasi" pohon ini dengan cepat menggunakan bytecodes yang dipancarkan; Saya tidak tahu apakah refleksi Java cukup kuat.
sumber
Lihat:
sumber
Tidak. Linq membutuhkan banyak fitur bahasa yang hanya dimiliki oleh Java
sumber
Gunakan Scala , untuk alasan yang dijelaskan di sini :
Jika tidak bisa, Anda dapat mencoba menggunakan libs seperti functionjava atau lambdaj , tetapi Anda tidak akan benar-benar dekat dengan LINQ.
sumber
Saya akan menambahkan jambu ke daftar perpustakaan yang dapat membantu Anda mencapai beberapa hal yang dilakukan LINQ.
Tetapi seperti yang telah ditunjukkan orang lain, tidak ada padanan di Jawa murni.
sumber
Anda bisa menggunakan Korma , sebuah DSL untuk query SQL yang ditulis dalam Clojure.
Sintaksnya cukup rapi:
Anda dapat memanggil ini dengan mudah dari Jawa dengan mengimpor pustaka Clojure yang relevan dan hanya menggunakan interop Clojure / Java normal.
sumber
Tidak ada fitur asli di java yang meniru linq. Namun, ada beberapa API yang menyediakan fungsionalitas yang sama.
Misalnya, posting blog ini memiliki toples khusus untuk mereplikasi linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
Dan ini adalah contoh penggunaan API dari pos:
Misalkan kita memiliki objek Hewan yang berisi nama dan ID yang diwakili dengan daftar
animals
. Jika kita ingin mendapatkan semua nama Hewan yang berisi 'o' dari daftaranimals
, kita dapat menulis kueri berikutfrom(animals).where("getName", contains("o")).all();
Ada dua API lain yang dirujuk dalam posting blog: lambdaJ dan jLinq
sumber
where("getName", ...)
.