Java'da Linq'in işlevselliğini sağlamaya yaklaşan bir kütüphane var mı?
Java'da Linq'in işlevselliğini sağlamaya yaklaşan bir kütüphane var mı?
Yanıtlar:
Tam LINQ sorgu sözdizimini elde etmek için, yeni anahtar kelimeleri ve sözdizimi yapısını destekleyen dil spesifikasyonlarını ve derleyicileri güncellemeniz gerekir. Bu, çoğu okuyucunun çok ötesinde.
Java'da Linq benzeri yöntem-zincir sözdizimini C # 'daki gibi görünen ve çalışan bir şekilde almak için Java'nın desteklemediği iki şeye ihtiyacınız vardır; genişletme yöntemleri (bir örneğe örnek yöntemi gibi uygulanabilen statik yöntemler) ve lambda ifadeleri (anonim delegeler). Ancak, biraz ekstra kodlama ayrıntısına girmeye istekli iseniz, bu ikisi mevcut Java yapılarıyla taklit edilebilir. Java hakkında özellikle şaşırtıcı bulduğum bir şey, anonim arayüz uygulamaları oluşturma yeteneğidir; ihtiyacınız olan her yöntem imzası için bir arabirim olması koşuluyla, basit anonim delegelere izin veren tek bir saf işlev içeren bir arabirime uygulanır.
Bu nedenle, bir yöntem zinciri olarak Linq'in IEnumerable (Javaheads için yinelenebilir) tarafının Java'da yaklaşık olması mümkün olmalıdır; temel olarak bir monad'ı kontrol eden akıcı bir arayüz olarak uygularsınız. LinqIterable
Tekrarlanabilir bir uygulama gibi bir sınıfa ihtiyacınız vardır:
Yani, muhtemelen aşağıdaki gibi bir ifadeye izin verecek bir "akıcı" kütüphane tanımlayabilirsiniz:
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;}});
Gerçek kütüphanenin oluşturulması, bir İnternet Soru-Cevap yanıtının kapsamının çok ötesinde bir alıştırmadır. Sadece mümkün olduğunu söyledim, kolay değil.
İfade ağaçları roket bilimi değildir, ancak .NET'in bu alanda sahip olduklarını uygulamak önemli bir proje olacaktır; sadece bir ifade ağacı oluşturma yeteneğine değil, yayılan bayt kodları kullanarak bu ağacı anında "derleyebilmeniz" gerekir; Java'nın yansımasının o kadar güçlü olup olmadığını bilmiyorum.
Görmek:
Hayır. Linq, Java'nın sadece dozajda sahip olduğu birçok lang özellik gerektirir
Kullanım Scala için sebepler burada izah :
Scala'nın .NET portunu kullanın. Açıkçası LINQ içeren .NET'teki her şeye tam yerel erişim sağlar.
Eğer yapamıyorsanız, functionjava veya lambdaj gibi libs kullanmaya çalışabilirsiniz , ancak LINQ'ya gerçekten yaklaşmayacaksınız.
LINQ'nun yaptığı bazı şeyleri başarmanıza yardımcı olabilecek kütüphaneler listesine guava eklerim .
Ancak diğerlerinin de belirttiği gibi, saf Java'da eşdeğeri yoktur.
Sen kullanabilirsiniz Korma , Clojure yazılan SQL sorguları için DSL.
Sözdizimi oldukça düzgün:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
İlgili Clojure kitaplıklarını içe aktararak ve yalnızca normal Clojure / Java birlikte çalışmasını kullanarak bunu Java'dan kolayca çağırabilirsiniz.
Java'da linq'i taklit eden yerel bir özellik yoktur. Ancak, aynı işlevselliği sağlayan birkaç API vardır.
Örneğin, bu blog yazısında linq çoğaltmak için özel bir kavanoz vardır.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
Ve bu, gönderiden API'nin örnek bir kullanımıdır:
Bir liste ile temsil edilen ad ve kimlik içeren bir Animal neslimiz olduğunu varsayalım animals
. Listeden 'o' içeren tüm Hayvan adlarını almak istiyorsak animals
, aşağıdaki sorguyu yazabiliriz
from(animals).where("getName", contains("o")).all();
Blog gönderisinde referans verilen iki API daha var: lambdaJ ve jLinq
where("getName", ...)
.