Frage

Erster LINQ mit C # lernen.
Vor allem LINQ to Objects und LINQ to XML.
Ich genieße wirklich die Macht des LINQ.

Ich habe gelernt, dass es etwas namens JLINQ eine JScript-Implementierung.
Auch (als Catbert geschrieben) Scala haben LINQ

Sie wissen, wenn LINQ oder etwas ähnliches wird ein Teil von Java 7 sein?

Update: Interessanter Beitrag von 2008 - LINQ für Java-Tool

War es hilfreich?

Lösung

Lesen Sie Scala , die leistungsstarke funktionale Programmiersprache ist, ist aber ähnlich wie Java und läuft auf Java-Plattform.

In Scala ist es möglich, im Wesentlichen die gleichen Code zu verwenden Konstrukte wie in LINQ, wenn auch ohne spezielle Abfrage Comprehensions vorhanden Syntax in C # oder VB.

EDIT:

Hier ist ein Beispiel von Scala Abfragefunktionen:

// 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
}

Andere Tipps

Es ist wichtig zu beachten, dass LINQ sind vier Dinge:

  • Monadic Verständnis
  • Datenbank-Integration
  • SQL-ähnliche Syntax
  • AST Manipulation

Leute, die nur davon gehört haben, können einfach daran denken, wie Datenbank-Integration. Menschen, die ein wenig mit ihm gearbeitet haben, denken wahrscheinlich von SQL-ähnlicher Syntax. Diejenigen, die wirklich in gegraben werden sich bewusst sein monadischen Verständnis Aspekt davon, auch wenn sie es nicht wissen, was es ist.

Wenn man Scala nimmt, zum Beispiel, hat es monadischen Verständnis ohne die anderen drei. Es gibt eine Bibliothek namens ScalaQuery die Datenbankintegration durch die monadische Verständnis bietet (die intrinsische Fähigkeit, dies zu tun wobei der Hauptgrund Monaden sind cool). Ein weiteres Projekt, genannt ScalaQL , glaube ich, beabsichtigt zu schaffen so ziemlich das gleiche, aber eine Compiler-Plugin, es zu verbessern. Ich hatte keine Kenntnis von Miguel Garcia Arbeit, die Sie erwähnt, aber gesehen, andere Sachen, die er hat erreicht, ich bin begeistert von ihr.

Man braucht keine spezielle Syntax monadischen Verständnis, aber zu tun. Es macht es nur von vorformulierten ordentlich. So dass Aspekt davon ist auf Sprachen mit dem richtigen Maß an Generika-Unterstützung sofort zur Verfügung.

Zwei Dinge Scala nicht tun. Die erste ist SQL-ähnliche Syntax. Das kann nicht viel geholfen werden: SQL-Syntax sieht fehl am Platz in Scala. Ich denke, es ist sicher die meisten Scala Programmierer sagen würde bleiben möchte, was ihnen vertraut ist -. Die so genannte für Comprehensions

Die andere Sache ist die, die ich noch nicht besprochen haben, AST Manipulation. Das ist die Möglichkeit, Code zu manipulieren, die vom Compiler analysiert wurden, aber noch nicht in Bytecode umgewandelt, die Gewährung die Fähigkeit, es zu ändern, bevor die Erzeugung abgeschlossen ist.

Ich denke, so etwas ein Segen für die Scala wäre - Heck, in jede beliebige Sprache. Aber dann wieder habe ich einen Hintergrund als Forth-Programmierer, wo die Möglichkeit, Code zu ändern, wie es richtig ein von Gott gegeben wurde, zusammengestellt wurde. .Net kann es durch LINQ tun, und so können einige andere Sprachen, wie Ruby.

LINQ wäre schwer in Java sein aufgrund des aktuellen Mangel an Schließungen. Unter der Annahme, Java 7 wirklich hat erhalten recht kompakter Abschließung Unterstützung und Erweiterungsmethoden, LINQ in Bezug auf die „Punktnotation“ möglich sein sollte, auch wenn es nicht das Äquivalent von Abfrageausdrücken bekommt.

Die Google Sammlungen Bibliothek (jetzt bei 1,0 - sondern durch Guava , wenn diese bereit ist) enthält viele der erforderlichen Methoden - und ich wäre nicht überrascht 101 LINQ-ähnliche APIs, sobald der Verschluss Unterstützung maßen endgültig sieht aufspringen zu sehen.

Ich kann nicht (im Moment) sehen Java etwas wie Ausdruck Bäume bekommen, aber -. So dass ich vermute, dass Sie auf LINQ to Objects beschränkt werden, es sei denn Sie benutzerdefinierte Zusammenstellung haben

Durch die Verwendung des lambdaj Bibliothek können Sie die Top-Ruf Nutzer finden, wie folgt:

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

Es hat respektieren einige Vorteile die Quaere Bibliothek, weil es keinen magischen String verwenden ist, ist es völlig sicher geben und meiner Meinung nach bietet es einen lesbaren DSL.

Sehen Sie sich Quaere . Es ist ein LINQ-wie DSL für Java, die Sie als Bibliothek enthalten. Beispiel:

// 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());
}

Beachten Sie jedoch, dass Java nicht ein Konzept analog zu Erweiterungsmethoden hat. Was auch immer der in Quaere ist ziemlich viel, was Sie stecken mit; wenn Sie brauchen, um Ihre eigene spezielle Dienstprogramme zu machen, sie werden wahrscheinlich in separaten Utility-Klassen sein müssen (ick).

Darüber hinaus, da Java <7 keine nativen Schließungen hat, sind Sie mit Strings stecken Dinge zu verweisen und Ihre IDE diejenigen, die nicht introspect können Sie Probleme zu zeigen, wenn Sie etwas falsch eingegeben haben. (A smarter IDE könnte in der Lage sein, dieses Manko zu handhaben, aber wenn jemand Selbstbeobachtung Plugins für Quaere schreiben ist.)

Sie könnten versuchen, diting die verkettbar Abfragemethoden auf einer Sammlung implementiert.

   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 oder Sammlung Query Engine http://code.google.com/p/cqengine/ scheint äußerst vielversprechend. Haben es nicht, obwohl versucht. Es ermöglicht Ihnen, Indizes über Sammlungen zu erstellen und diese abzufragen. Vermeintliche sehr schnell sein.

Gibt es etwas so einfach zu bedienen wie LINQ-2-SQL auf der JVM? Ich mag Entitäten (Klassen) von dem DB-Schema und verwenden diejenigen mit etwas Werkzeug erzeugen, direkt mit der DB zu interagieren. Gibt es eine XML-freie Lösung? Ich will nicht die Klassen mit Anmerkungen versehen haben. In .NET wird das Werkzeug sqlmetal genannt. Es ist eine Art von Pre-Prozessor, der, alle DB-Klassen erzeugt sozusagen.

Sobald dies geschehen ist, ich glaube, es wird ziemlich einfach Scala in Sprachkonstrukten gebaut zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top