Domanda

Ha iniziato a imparare LINQ con C #.
Soprattutto LINQ to Objects e LINQ to XML.
Mi piace molto il potere di LINQ.

ho imparato che c'è qualcosa chiamato JLINQ un'implementazione JScript.
Inoltre (come pubblicato Catbert) Scala avrà LINQ

Sai se LINQ o qualcosa di simile sarà una parte di Java 7?

Aggiornamento: Interessante post dal 2008 - LINQ per lo strumento Java

È stato utile?

Soluzione

Scala , che è potente linguaggio di programmazione funzionale, ma è simile a Java e gira su piattaforma Java.

In Scala è possibile utilizzare sostanzialmente lo stesso codice costruisce come in LINQ, pur senza comprehensions query speciali sintassi presenti in C # o VB.

Modifica

Ecco un esempio delle capacità di interrogazione della Scala:

// Get all StackOverflow users with more than 20,000 reputation points.
val topUsers = for{
    u <- users
    if u.reputation > 20000
} yield u;

println ("Users with more than 20,000 reputation:")
for (u <- topUsers) {
    println u.name
}

Altri suggerimenti

E 'importante notare che LINQ sono quattro cose:

  • comprensione Monadica
  • integrazione database
  • sintassi SQL-like
  • manipolazione AST

Le persone che appena hanno sentito parlare di esso può pensare ad esso semplicemente come l'integrazione di database. Le persone che hanno lavorato un po 'con esso probabilmente pensano di sintassi SQL-like. Coloro che veramente scavato in sapranno dell'aspetto di comprensione monadica di esso, anche se non lo sanno per quello che è.

Se si prende Scala, ad esempio, ha la comprensione della monade, senza gli altri tre. C'è una libreria chiamata ScalaQuery che prevede l'integrazione di database attraverso la comprensione della monade (la capacità intrinseca di farlo essendo la ragione principale per monadi sono fresche). Un altro progetto, chiamato ScalaQL , credo, si propone di fornire più o meno la stessa cosa, ma utilizzando un plugin compilatore di valorizzarlo. Non ero a conoscenza del lavoro di Miguel Garcia lei ha citato, ma, avendo altre cose visto che ha compiuto, io sono entusiasta da esso.

Non c'è bisogno sintassi speciale per fare la comprensione della monade, comunque. Si rende solo più sgombra da boilerplate. In modo che aspetto di essa è immediatamente disponibile per le lingue con il giusto livello di supporto generici.

Due cose Scala non fa. Il primo è la sintassi SQL-like. Che molto non può essere aiutato: la sintassi SQL sembra fuori posto a Scala. Penso che sia giusto dire maggior parte dei programmatori Scala preferisce rimanere con ciò che è familiare a loro -. Il cosiddetto espressioni for

L'altra cosa è quello che non ho ancora discusso, manipolazione AST. Questa è la capacità di manipolare il codice che è stato analizzato dal compilatore, ma non ancora trasformato in bytecode, garantendo la possibilità di modificarlo prima che venga completata la generazione.

Credo che una cosa del genere sarebbe una manna per Scala - diamine, a qualsiasi lingua. Ma, poi di nuovo, ho un background come un programmatore Forth, dove la capacità di alterare il codice come è stato in fase di compilazione è stato un diritto divino. .NET possono farlo attraverso LINQ, e può così alcuni altri linguaggi, come Ruby.

LINQ sarebbe difficile in Java a causa della attuale mancanza di chiusure. Supponendo Java 7 davvero non ottenere ragionevolmente compatte supporto chiusura e Metodi di estensione, LINQ in termini di "notazione punto" dovrebbe essere fattibile, anche se non ottiene l'equivalente di espressioni di query.

Il Google Collezioni Biblioteca (ora al 1,0 - ma per essere sostituito da < a href = "http://code.google.com/p/guava-libraries/" rel = "noreferrer"> Guava quando cioè pronto) contiene molti dei metodi richiesti - e non sarebbe sorpreso di vedere 101 API LINQ come la primavera non appena il supporto di chiusura sembra ragionevolmente finale.

Non riesco a vedere (per il momento) di Java ottenere nulla come gli alberi di espressione, tuttavia -. Così ho il sospetto sarete limitati a LINQ to Objects a meno che non si dispone di compilation personalizzate

Usando il lambdaj biblioteca si possono trovare i migliori utenti di reputazione come segue:

List<User> topUsers = 
    select(users, having(on(User.class).getReputation(), greaterThan(20000)));

Si presenta alcuni vantaggi rispetto alla biblioteca Quaere perché non utilizzare qualsiasi stringa di magia, è completamente di tipo sicuro e, a mio parere, e offre una connessione DSL più leggibile.

Quaere . Si tratta di un DSL LINQ-come per Java che è possibile includere in una biblioteca. Esempio:

// Get all StackOverflow users with more than 20,000 reputation points.
Iterable<User> topUsers = from("u").in(entityManager.entity(User.class)).
    where(gt("u.getReputation()", 20000)).
    select("u");

System.out.println("Users with more than 20,000 reputation:");
for (User u : topUsers) {
    System.out.println(u.getName());
}

Si noti tuttavia che Java non ha un concetto analogo a metodi di estensione. Qualunque cosa di in Quaere è più o meno quello che sei bloccato con; se avete bisogno di fare le proprie utilità speciali, che probabilmente devono essere in classi di utilità separati (ick).

Inoltre, perché Java <7 non ha chiusure nativi, sei bloccato con le stringhe di riferimento le cose, e il vostro IDE non può introspezione coloro visualizzare problemi se si digitano qualcosa. (A IDE più intelligente potrebbe essere in grado di gestire questa lacuna, però, se qualcuno dovesse scrivere plugin introspezione per Quaere.)

Si potrebbe provare a Diting che implementa metodi di query chainable su una collezione.

   Integer[] values = new Integer[] {0,1,2,3,4,5,6,7,8,9,10};

   Enumerable<Integer> query = new Enumerable<Integer>(values).where(new Predicate<Integer>(){

    @Override
    public boolean evaluate(Integer value) throws Exception {
        return value % 2 == 0;
    }});

   for(Integer i : query)
   {
       System.out.write(i);
       System.out.write('\n');
   }

CQEngine o Collezione query del motore di http://code.google.com/p/cqengine/ sembra estremamente promettente. Non ho provato, però. Esso consente di costruire indici su collezioni e ricerca. Dovrebbe essere molto veloce.

C'è qualcosa di semplice da usare come LINQ-2-SQL sulla JVM? Voglio generare entità (classi) dal regime di DB utilizzando qualche strumento e usare quelli di interagire direttamente con il DB. C'è una soluzione priva di XML? Io non voglio avere a annotare le classi. In .NET, lo strumento si chiama SQLMetal. Si tratta di una sorta di pre-processore che genera tutte le classi DB, per così dire.

Una volta fatto questo, io penso che sarà abbastanza facile da usare Scala di costruito in costrutti del linguaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top