Apa yang setara dengan Java untuk LINQ?
Apa yang setara dengan Java untuk LINQ?
Jawaban:
Tidak ada yang seperti LINQ untuk Java.
...
Edit
Sekarang dengan Java 8 kami diperkenalkan dengan Stream API , ini adalah hal yang mirip ketika berhadapan dengan koleksi, tetapi tidak persis sama dengan Linq.
Jika ORM yang Anda cari, seperti Entity Framework, maka Anda dapat mencoba Hibernate
:-)
Ada solusi alternatif, Koollection .
Coolection tidak berpura-pura menjadi lambda baru, namun kami dikelilingi oleh proyek-proyek lama Jawa di mana lib ini akan membantu. Ini sangat sederhana untuk digunakan dan diperluas, hanya mencakup tindakan iterasi yang paling banyak digunakan pada koleksi, seperti itu:
from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();
Lambdas sekarang tersedia dalam Java 8 dalam bentuk JSR-335 - Ekspresi Lambda untuk Bahasa Pemrograman JavaTM
UPDATE : JDK8 sekarang telah dirilis yang berisi lambda proyek. Layak untuk mengambil salinan Java 8 in Action yang saat ini masih MEAP.
Bacalah artikel Brian Goetz yang berkaitan dengan lambdas untuk pemahaman yang layak tentang bagaimana lambdas diimplementasikan dalam JDK8 sementara juga mendapatkan pemahaman tentang stream, iterasi internal, hubungan pendek dan referensi konstruktor .. Juga periksa JSR di atas untuk mendapatkan contoh lebih lanjut .
Saya telah menulis sebuah blog tentang beberapa keuntungan menggunakan lambdas di JDK8 yang disebut The Power of the Arrow , juga NetBeans 8 memiliki dukungan besar untuk mengkonversi konstruk ke JDK8 yang saya juga blogging tentang Migrasi ke JDK 8 dengan NetBeans .
Anda dapat memilih item dalam koleksi (dan banyak lagi) dengan cara yang lebih mudah dibaca dengan menggunakan perpustakaan lambdaj
https://code.google.com/archive/p/lambdaj/
Ini memiliki beberapa keunggulan dibandingkan perpustakaan Quaere karena tidak menggunakan string ajaib, itu benar-benar tipe aman dan menurut saya itu menawarkan DSL yang lebih mudah dibaca.
Anda tidak akan menemukan padanan LINQ kecuali Anda menggunakan javacc untuk membuat padanan Anda sendiri.
Sampai hari itu ketika seseorang menemukan cara yang layak untuk melakukannya, ada beberapa alternatif yang baik, seperti
LINQ ke Objek - JAVA 8 telah menambahkan API Stream yang menambahkan dukungan untuk operasi gaya fungsional pada aliran nilai:
Java 8 Dijelaskan: Menerapkan Koleksi Lambdas ke Java
LINQ ke SQL / NHibernate / dll. (query database) - Salah satu opsi adalah menggunakan JINQ yang juga menggunakan fitur JAVA 8 baru dan dirilis pada 26 Februari 2014 di Github: https://github.com/my2iu/Jinq
Jinq menyediakan pengembang cara mudah dan alami untuk menulis kueri basis data di Jawa. Anda dapat memperlakukan data basis data seperti objek Java normal yang disimpan dalam koleksi. Anda dapat mengulanginya dan memfilternya menggunakan perintah Java normal, dan semua kode Anda akan secara otomatis diterjemahkan ke dalam kueri basis data yang dioptimalkan. Akhirnya, kueri gaya LINQ tersedia untuk Java!
Situs proyek JINQ: http://www.jinq.org/
Ada proyek yang disebut quaere .
Ini adalah kerangka kerja Java yang menambahkan kemampuan untuk meminta koleksi.
Catatan: Menurut penulis, proyek tidak dipertahankan lagi.
from x in xs select x
dan menemukan jawabannya (tidak).
Ada banyak padanan LINQ untuk Java, lihat di sini untuk perbandingan.
Untuk kerangka kerja gaya Quaere / LINQ yang aman, coba gunakan Querydsl . Querydsl mendukung JPA / Hibernate, JDO, SQL dan Java Collections.
Saya adalah pengelola Querydsl, jadi jawaban ini bias.
Seperti pada 2014, saya akhirnya bisa mengatakan bahwa LINQ akhirnya ada di java 8. Jadi tidak perlu mencari alternatif LINQ lagi.
Sekarang Java 8 mendukung lambdas, dimungkinkan untuk membuat API Java yang sangat mirip dengan LINQ.
Jinq adalah salah satu pustaka gaya LINQ baru untuk Java.
Saya adalah pengembang perpustakaan ini. Ini didasarkan pada lima tahun penelitian tentang penggunaan analisis bytecode untuk menerjemahkan Java ke permintaan basis data. Mirip dengan bagaimana C # D-LINQ adalah lapisan permintaan yang duduk di atas Entity Framework, Jinq dapat bertindak sebagai lapisan permintaan yang berada di atas JPA atau jOOQ. Ini memiliki dukungan untuk agregasi, grup, dan subkueri. Bahkan Erik Meijer (pencipta LINQ) telah mengakui Jinq .
Lihat SBQL4J . Ini adalah jenis bahasa query kuat yang aman yang terintegrasi dengan Java. Mengizinkan menulis kueri yang rumit dan berlipat ganda. Ada banyak operator, metode Java dapat dipanggil dalam permintaan sehingga sebagai konstruktor. Permintaan diterjemahkan ke kode Java murni (tidak ada refleksi saat runtime) sehingga eksekusi sangat cepat.
EDIT: Yah, sejauh ini SBQL4J itu adalah ekstensi HANYA ke bahasa Java yang memberikan kemampuan query yang mirip dengan LINQ. Ada beberapa proyek menarik seperti Quaere dan JaQue tetapi mereka hanya API, bukan ekstensi sintaksis / semantik dengan keamanan tipe kuat dalam waktu kompilasi.
Java LINQ untuk implementasi SQL . Menyediakan integrasi bahasa lengkap dan set fitur yang lebih besar dibandingkan dengan .NET LINQ.
Saya mencoba jambu-perpustakaan dari google. Ini memiliki FluentIterable
yang saya pikir dekat dengan LINQ. Juga lihat FunctionalExplained .
List<String> parts = new ArrayList<String>(); // add parts to the collection.
FluentIterable<Integer> partsStartingA =
FluentIterable.from(parts).filter(new Predicate<String>() {
@Override
public boolean apply(final String input) {
return input.startsWith("a");
}
}).transform(new Function<String, Integer>() {
@Override
public Integer apply(final String input) {
return input.length();
}
});
Tampaknya menjadi perpustakaan yang luas untuk Jawa. Tentu saja tidak sesingkat LINQ tetapi terlihat menarik.
https://code.google.com/p/joquery/
Mendukung berbagai kemungkinan,
Koleksi yang diberikan,
Collection<Dto> testList = new ArrayList<>();
dari jenis,
class Dto
{
private int id;
private String text;
public int getId()
{
return id;
}
public int getText()
{
return text;
}
}
Saring
Java 7
Filter<Dto> query = CQ.<Dto>filter(testList)
.where()
.property("id").eq().value(1);
Collection<Dto> filtered = query.list();
Java 8
Filter<Dto> query = CQ.<Dto>filter(testList)
.where()
.property(Dto::getId)
.eq().value(1);
Collection<Dto> filtered = query.list();
Juga,
Filter<Dto> query = CQ.<Dto>filter()
.from(testList)
.where()
.property(Dto::getId).between().value(1).value(2)
.and()
.property(Dto::grtText).in().value(new string[]{"a","b"});
Penyortiran (juga tersedia untuk Java 7)
Filter<Dto> query = CQ.<Dto>filter(testList)
.orderBy()
.property(Dto::getId)
.property(Dto::getName)
Collection<Dto> sorted = query.list();
Pengelompokan (juga tersedia untuk Java 7)
GroupQuery<Integer,Dto> query = CQ.<Dto,Dto>query(testList)
.group()
.groupBy(Dto::getId)
Collection<Grouping<Integer,Dto>> grouped = query.list();
Bergabung (juga tersedia untuk Java 7)
Diberikan,
class LeftDto
{
private int id;
private String text;
public int getId()
{
return id;
}
public int getText()
{
return text;
}
}
class RightDto
{
private int id;
private int leftId;
private String text;
public int getId()
{
return id;
}
public int getLeftId()
{
return leftId;
}
public int getText()
{
return text;
}
}
class JoinedDto
{
private int leftId;
private int rightId;
private String text;
public JoinedDto(int leftId,int rightId,String text)
{
this.leftId = leftId;
this.rightId = rightId;
this.text = text;
}
public int getLeftId()
{
return leftId;
}
public int getRightId()
{
return rightId;
}
public int getText()
{
return text;
}
}
Collection<LeftDto> leftList = new ArrayList<>();
Collection<RightDto> rightList = new ArrayList<>();
Dapat Bergabung seperti,
Collection<JoinedDto> results = CQ.<LeftDto, LeftDto>query().from(leftList)
.<RightDto, JoinedDto>innerJoin(CQ.<RightDto, RightDto>query().from(rightList))
.on(LeftFyo::getId, RightDto::getLeftId)
.transformDirect(selection -> new JoinedDto(selection.getLeft().getText()
, selection.getLeft().getId()
, selection.getRight().getId())
)
.list();
Ekspresi
Filter<Dto> query = CQ.<Dto>filter()
.from(testList)
.where()
.exec(s -> s.getId() + 1).eq().value(2);
Anda dapat mencoba koleksi saya CollectionsQuery . Hal ini memungkinkan untuk menjalankan LINQ seperti kueri atas koleksi objek. Anda harus melewati predikat, seperti di LINQ. Jika Anda menggunakan java6 / 7 daripada Anda harus menggunakan sintaks lama dengan Antarmuka:
List<String> names = Queryable.from(people)
.filter(new Predicate<Person>() {
public boolean filter(Person p) {
return p.age>20;
}
})
.map (new Converter<Person,String>() {
public Integer convert(Person p) {
return p.name;
}
})
.toList();
Anda juga dapat menggunakannya di Java8, atau di java lama dengan RetroLambda dan plugin gradle , maka Anda akan memiliki sintaks mewah baru:
List<String> names = Queryable.from(people)
.filter(p->p.age>20)
.map (p->p.name)
.toList();
Jika Anda perlu menjalankan query DB, daripada yang dapat Anda lihat di JINQ, seperti yang disebutkan di atas, tetapi tidak dapat di-porting kembali oleh RetroLambda, lakukan penggunaan lambdas berseri.
Hanya untuk menambahkan alternatif lain: Java 6 memang memiliki solusi untuk query database tipe-aman menggunakan paket javax.persistence.criteria .
Meskipun saya harus mengatakan bahwa ini bukan LINQ, karena dengan LINQ Anda dapat meminta setiap IEnumerable.
Ada perpustakaan yang sangat bagus yang dapat Anda gunakan untuk ini.
Terletak di sini: https://github.com/nicholas22/jpropel-light
Lambdas tidak akan tersedia sampai Java 8, jadi menggunakannya sedikit berbeda dan tidak terasa alami.
Kedengarannya seperti Linq yang dibicarakan semua orang di sini hanyalah LinqToObjects. Yang saya percaya hanya menawarkan fungsionalitas yang sudah dapat dicapai hari ini di Jawa, tetapi dengan sintaks yang benar-benar jelek.
Apa yang saya lihat sebagai kekuatan sebenarnya dari Linq di .Net adalah bahwa ekspresi lambda dapat digunakan dalam konteks yang membutuhkan delegasi atau ekspresi dan kemudian akan dikompilasi ke dalam bentuk yang sesuai. Inilah yang memungkinkan hal-hal seperti LinqToSql (atau apa pun selain LinqToObjects) berfungsi, dan memungkinkan mereka memiliki sintaksis yang identik dengan LinqToObjects.
Sepertinya semua proyek yang disebutkan di atas hanya menawarkan kemampuan LinqToObjects. Yang membuat saya hal bahwa fungsi tipe LinqToSql tidak di cakrawala untuk Jawa.
Untuk koleksi fungsional dasar, Java 8 memiliki built-in, sebagian besar bahasa JVM non-Java utama memilikinya built-in (Scala, Clojure, dll), dan Anda bisa menambahkan libs untuk versi Java yang lebih lama.
Untuk akses terintegrasi bahasa penuh ke database SQL, Scala (berjalan pada JVM) memiliki Slick
Untuk LINQ (LINQ to Objects), Java 8 akan memiliki sesuatu yang setara, lihat Project Lambda .
Ini memiliki Enumerable's LINQ untuk ekstensi Objects seperti barang . Tetapi untuk hal-hal LINQ yang lebih rumit seperti Ekspresi dan ExpressionTree (ini diperlukan untuk LINQ ke SQL dan penyedia LINQ lainnya jika mereka ingin memberikan sesuatu yang dioptimalkan dan nyata), belum ada yang setara tapi mungkin kita akan melihat itu di masa depan :)
Tapi saya tidak berpikir akan ada sesuatu seperti pertanyaan deklaratif di Jawa di masa depan
Tidak ada fitur seperti itu di java. Dengan menggunakan API lain Anda akan mendapatkan fitur ini. Seperti misalkan kita memiliki Obyek hewan yang berisi nama dan id. Kami memiliki objek daftar yang memiliki objek hewan. Sekarang jika kita ingin mendapatkan semua nama hewan yang berisi 'o' dari daftar objek. kita bisa menulis kueri berikut
from(animals).where("getName", contains("o")).all();
Pernyataan Query di atas akan daftar binatang yang berisi alfabet 'o' dalam nama mereka. Informasi lebih lanjut silakan kunjungi blog berikut. http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
Lihat mungil-q . (Perhatikan bahwa saat ini Anda tidak dapat mengunduhnya.)
Berikut ini contoh yang menyesuaikan tautan di atas:
Pertama kita perlu kumpulan beberapa data, katakanlah seperangkat string
String[] strings = { "bla", "mla", "bura", "bala", "mura", "buma" };
Sekarang kami ingin memilih hanya string yang dimulai dengan "b":
Query<String> stringsStartingWithB = new Query<String>(strings).where(
new Query.Func<String, Boolean>(){
public Boolean run(String in) {
return in.startsWith("b");
}
}
);
Tidak ada data aktual yang dipindahkan yang disalin atau semacamnya, itu akan diproses segera setelah Anda mulai mengulanginya:
for(String string : stringsStartingWithB ) {
System.out.println(string);
}
JaQu adalah padanan LINQ untuk Java. Meskipun dikembangkan untuk basis data H2, ia harus bekerja untuk basis data apa pun karena menggunakan JDBC.
Mungkin bukan jawaban yang Anda harapkan, tetapi jika beberapa bagian dari kode Anda memerlukan pekerjaan berat pada koleksi (pencarian, pengurutan, pemfilteran, transformasi, analisis), Anda dapat mempertimbangkan untuk menulis beberapa kelas di Clojure atau Scala .
Karena sifatnya yang fungsional, bekerja dengan koleksi adalah yang terbaik. Saya tidak punya banyak pengalaman dengan Scala, tetapi dengan Clojure Anda mungkin akan menemukan Linq yang lebih kuat di ujung jari Anda dan setelah dikompilasi, kelas yang Anda hasilkan akan berintegrasi mulus dengan sisa basis kode.
Seorang pengguna anonim menyebutkan satu lagi, Diting :
Diting adalah pustaka kelas yang menyediakan kemampuan kueri pada koleksi melalui metode berantai dan antarmuka anonim seperti Linq di .NET. Tidak seperti kebanyakan perpustakaan koleksi lain yang menggunakan metode statis perlu mengulangi seluruh koleksi, Diting menyediakan inti Enumerable class whitch berisi metode yang dapat ditangguhkan yang dideferensi untuk mengimplementasikan kueri pada koleksi atau array.
Metode yang Didukung: any, cast, contact, berisi, hitung, berbeda, elementAt, kecuali, pertama, pertama, atau Kesalahan, grup. Dengan, interset, gabung, terakhir, terakhir, atau Kesalahan, dari Jenis, pesanan, Dengan, kirim, turun, balikkan, pilih, pilihBanyak, tunggal, tunggal atau Kerusakan, lewati , skipWhile, take, takeWhile, toArray, toArrayList, union, where
Scala. Sekarang saya membacanya, dan menemukannya seperti LINQ tetapi lebih sederhana dan lebih tidak dapat dibaca. tapi scala bisa dijalankan di linux, ya? csharp butuh mono.
Ada bahasa pemrograman Pizza (ekstensi Java) dan Anda harus melihatnya. - Menggunakan konsep "antarmuka lancar" untuk meminta data dengan cara deklaratif dan yang pada prinsipnya identik dengan LINQ tanpa ekspresi permintaan (http://en.wikipedia.org/wiki/Pizza_programming_language). Namun sayang itu tidak dikejar, tetapi itu akan menjadi salah satu cara untuk mendapatkan sesuatu yang mirip dengan LINQ ke Jawa.
Tidak ada yang setara dengan LINQ untuk Java. Tetapi ada beberapa API eksternal yang terlihat seperti LINQ seperti https://github.com/nicholas22/jpropel-light , https://code.google.com/p/jaque/
Anda dapat mencoba perpustakaan ini: https://code.google.com/p/qood/
Berikut beberapa alasan untuk menggunakannya: