Qual è il miglior equivalente Java per Linq? [chiuso]

17

Ci sono librerie in Java che si avvicinano per fornire le funzionalità di Linq?

    
posta rdasxy 18.10.2011 - 18:34
fonte

7 risposte

20

Per ottenere la sintassi completa della query LINQ, è necessario un aggiornamento alle specifiche della lingua e ai 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 la sintassi della catena dei metodi simile a Linq in Java che sembra e funziona come in C #, sono necessarie 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) e espressioni lambda (delegati anonimi). Tuttavia, questi due possono essere falsificati con i costrutti Java esistenti, se sei disposto a sostenere un po 'di verbosità in più. Una cosa che trovo particolarmente interessante in Java è la capacità di creare implementazioni di un'interfaccia anonima; applicato a un'interfaccia con una singola funzione pura, che consente fondamentalmente semplici delegati anonimi, a patto di avere 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 avresti praticamente implementato come un'interfaccia fluente che controlla una monade. Avresti bisogno di una classe come LinqIterable , implementando Iterable, che:

  • può convertire qualsiasi input Iterable in un'istanza LinqIterable
  • ha metodi per l'elaborazione di liste di base, come filtraggio, raggruppamento, concatenazione, intersezione, ordinamento, ecc. che accettano interfacce a singola funzione e producono nuovi LinqIterables, permettendo il concatenamento di questi metodi, si spera in modo "pigro".
  • ha metodi per trasformare LinqIterable in oggetti "concreti" come ToList, ToArray, ToMap, ecc.

Quindi, potresti probabilmente definire una libreria "fluente" che consentirebbe un'istruzione 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 attuale è un esercizio che va oltre lo scopo di una risposta su Internet. Q & A. Ho appena detto che era possibile, non facile.

Gli alberi delle espressioni non sono scienza missilistica, ma sarebbe un progetto significativo implementare ciò che .NET ha in quest'area; non solo hai bisogno della capacità di costruire un albero di espressioni, devi essere in grado di "compilare" questo albero al volo usando i bytecode emessi; Non so se il riflesso di Java sia abbastanza potente.

    
risposta data 18.10.2011 - 22:28
fonte
8

Vedi:

  • link - Alcuni dicono che non esiste un equivalente o che puoi utilizzare < a href="https://code.google.com/p/lambdaj/"> Lambdaj per simularlo.
  • link - C'è una menzione che prima di Java 8 puoi anche utilizzare le raccolte Google per fingere e che Scala la lingua lo supporta come una caratteristica del linguaggio, (Scala è un altro linguaggio popolare sulla JVM).
  • link - Una libreria Java che in teoria fornisce funzionalità LINQ (non l'ho provato io stesso) .
risposta data 18.10.2011 - 18:43
fonte
5

No. Linq richiede molte funzioni di langage che Java ha appena dosato

    
risposta data 18.10.2011 - 18:44
fonte
3

Utilizza Scala , per ragioni spiegate qui :

use the .NET port of Scala. It gives you full native access to everything in .NET, which obviously includes LINQ.

Se non puoi, puoi provare a utilizzare librerie come functionjava o lambdaj , ma non verrai molto vicino a LINQ.

    
risposta data 18.10.2011 - 20:43
fonte
2

Vorrei aggiungere guava all'elenco delle librerie che possono aiutarti a ottenere alcune delle cose LINQ lo fa.

Ma come altri hanno sottolineato, non esiste un equivalente in puro Java.

    
risposta data 18.10.2011 - 20:59
fonte
2

Potresti usare Korma , un DSL per query SQL scritto in Clojure.

La sintassi è abbastanza accurata:

(select user
  (with address)
  (fields :firstName :lastName :address.state)
  (where {:email "[email protected]"}))

Puoi chiamarlo abbastanza facilmente da Java importando le librerie Clojure rilevanti e usando semplicemente la normale interoperabilità Clojure / Java.

    
risposta data 12.09.2012 - 07:06
fonte
2

Non c'è una funzione nativa in java che imita linq. Tuttavia, esistono diverse API che forniscono la stessa funzionalità.

Ad esempio, questo post del blog ha un jar personalizzato per replicare linq.
link

E questo è un esempio dell'utilizzo dell'API dal post:

Supponiamo di avere un oggetto Animal contenente nome e ID che è rappresentato con un elenco di animals . Se vogliamo ottenere tutti i nomi degli animali che contengono 'o' dalla lista animals , possiamo scrivere la seguente query

from(animals).where("getName", contains("o")).all();

Ci sono altre due API a cui si fa riferimento nel post del blog: lambdaJ e jLinq

    
risposta data 12.09.2012 - 06:49
fonte

Leggi altre domande sui tag