Apakah ada perpustakaan di Jawa yang hampir menyediakan fungsionalitas Linq?
Apakah ada perpustakaan di Jawa yang hampir menyediakan fungsionalitas Linq?
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:
Map<String, Integer> results = Linq.FromIterable(sourceList)
.Where(new Predicate{public bool Op(SomeStruct in){return in.SomeString == "criteria";}})
.OrderBy(new Func{public String Op(SomeStruct in){return in.SomeOtherString;}})
.Select(new Func{public SomeOtherStruct Op(SomeStruct in){return new SomeOtherStruct(in.SomeOtherString, in.SomeInt);}})
.ToMap(new Func{public String Op(SomeOtherStruct in){return in.StringField;}},
new Func{public Integer Op(SomeOtherStruct in){return in.IntField;}});
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.
Lihat:
Tidak. Linq membutuhkan banyak fitur bahasa yang hanya dimiliki oleh Java
Gunakan Scala , untuk alasan yang dijelaskan di sini :
gunakan port .NET dari Scala. Ini memberi Anda akses asli penuh ke segala sesuatu di. NET, yang jelas termasuk LINQ.
Jika tidak bisa, Anda dapat mencoba menggunakan libs seperti functionjava atau lambdaj , tetapi Anda tidak akan benar-benar dekat dengan LINQ.
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.
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 "korma@sqlkorma.com"}))
Anda dapat memanggil ini dengan mudah dari Jawa dengan mengimpor pustaka Clojure yang relevan dan hanya menggunakan interop Clojure / Java normal.
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 daftar animals
, kita dapat menulis kueri berikut
from(animals).where("getName", contains("o")).all();
Ada dua API lain yang dirujuk dalam posting blog: lambdaJ dan jLinq
where("getName", ...)
.