Esistono librerie in Java che si avvicinano per fornire la funzionalità di Linq?
Esistono librerie in Java che si avvicinano per fornire la funzionalità di Linq?
Risposte:
Per ottenere la sintassi completa delle query LINQ, è necessario un aggiornamento delle specifiche della lingua e dei compilatori che supportano le nuove parole chiave e la struttura della sintassi. Questo è molto al di là della maggior parte dei lettori qui.
Per ottenere una sintassi della catena di metodi simile a Linq in Java che assomigli e funzioni come in C #, hai bisogno di due cose che Java non supporta; metodi di estensione (metodi statici che possono essere applicati a un'istanza come se fosse un metodo di istanza) ed espressioni lambda (delegati anonimi). Tuttavia, questi due possono essere falsificati con costrutti Java esistenti, se si è disposti a incorrere in un po 'più di verbosità di codifica. Una cosa che trovo particolarmente sorprendente di Java è la capacità di creare implementazioni di interfaccia anonime; applicato a un'interfaccia con un'unica funzione pura, che consente sostanzialmente semplici delegati anonimi, purché tu abbia un'interfaccia per ogni firma del metodo di cui avrai bisogno.
Quindi, il lato IEnumerable (Iterable for the Javaheads) di Linq, come una catena di metodi, dovrebbe essere possibile approssimare in Java; lo implementeresti fondamentalmente come un'interfaccia fluida che controlla una monade. Avresti bisogno di una classe come una LinqIterable
, implementando Iterable, che:
Quindi, potresti probabilmente definire una libreria "fluente" che consentirebbe una dichiarazione come:
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;}});
La creazione della biblioteca reale è un esercizio che va ben oltre lo scopo di una risposta su una domanda e risposta su Internet. Ho appena detto che era possibile, non facile.
Gli alberi delle espressioni non sono scienza missilistica, ma sarebbe un progetto significativo per implementare ciò che .NET ha in quest'area; non solo hai bisogno della capacità di costruire un albero delle espressioni, ma devi anche essere in grado di "compilare" questo albero al volo usando i bytecode emessi; Non so se il riflesso di Java sia così potente.
Vedere:
No. Linq richiede molte funzionalità di lingua che Java ha appena dosent
Usa Scala , per i motivi spiegati qui :
usa la porta .NET di Scala. Ti dà pieno accesso nativo a tutto in .NET, che ovviamente include LINQ.
Se non ci riesci, puoi provare a usare lib come functionjava o lambdaj , ma non ti avvicinerai molto a LINQ.
Aggiungerei guava all'elenco delle librerie che potrebbero aiutarti a realizzare alcune delle cose che LINQ fa.
Ma come altri hanno sottolineato, non esiste un equivalente in Java puro.
È possibile utilizzare Korma , una query DSL per SQL scritta in Clojure.
La sintassi è piuttosto ordinata:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Puoi chiamarlo abbastanza facilmente da Java importando le relative librerie Clojure e semplicemente usando la normale interoperabilità Clojure / Java.
Non esiste una funzione nativa in Java che imita Linq. Tuttavia, ci sono diverse API che offrono la stessa funzionalità.
Ad esempio, questo post di blog ha un barattolo personalizzato per replicare linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
E questo è un esempio di utilizzo dell'API dal post:
Supponiamo di avere un oggetto Animale contenente nome e ID che è rappresentato con un elenco di animals
. Se vogliamo ottenere tutti i nomi di animali che contengono 'o' dall'elenco animals
, possiamo scrivere la seguente query
from(animals).where("getName", contains("o")).all();
Ci sono altre due API citate nel post del blog: lambdaJ e jLinq
where("getName", ...)
.