2010-12-13 14 views
1

Ich habe Erfahrung in C# -Programmierung, aber ich muss etwas in Java-Projekt ändern, so ist meine Frage ist in JAVA ALLES ÄHNLICH LINQ IN C#? Ich muss Listen in Java abfragen.Linq wie für Java

+0

nicht wirklich gleich ... die Frage "LINQ for Java tool" ist mehr von Marktforschung. – CrazyDart

+0

Verwenden Sie die LAMBDAJ-Bibliothek. – Zasz

+1

Überprüfen Sie diese: github.com/nicholas22/jpropel-light, echtes Beispiel: new String [] {"James", "John", "John", "Eddie"} .where (startsWith ("j")). toList(). distinct(); –

Antwort

0

Es gibt nichts, das LINQ für Java ähnelt. Es tut uns leid. Durch googeln fand ich this project aber natürlich kann man nicht die gleiche Integration in die Sprache oder einen syntaktischen Zucker erwarten, den man in C# bekommen könnte.

5

Es hängt davon ab, was Sie genau tun möchten. C# 's Begriff der Lambda-Notation kann mit Hilfe von anonymen Klassen viel mehr imitiert werden. So könnten Sie eine Where Methode erstellen, die eine Function<T, bool> übernimmt, wobei Function<T1, TReturn> eine Klasse ist, die über eine einzelne Methode verfügt (z. B. Execute). Ich verstehe, dass Guava so etwas hat.

Die Idee wäre dann so etwas zu sagen:

Iterable<Ball> redBalls = Enumerable.Where(balls, 
    new Function<Ball, bool>() { 
     public bool Execute(Ball b) { return b.getColor() == Color.Red; } 
    }); 

Doch trotz all dieser Arbeit, könnte man genauso gut es sans Linq getan haben:

List<Ball> redBalls = new ArrayList<Ball>(); 
for(Ball ball in balls) { 
    if(ball.getColor() == Color.Red) {redBalls.add(ball);} 
} 

Leider ist es eine weit weine aus dem, was du tun kannst, wenn du Lambda-Ausdrücke, abgeleitete Typen, Eigenschaften und Erweiterungsmethoden kombinierst, so wie C#.

var redBalls = balls.Where(b => b.Color == Color.Red); 

-Code wie dies nur möglich sein, wenn Java Lambda-Ausdrücke implementiert, die für die Version 7 geplant war, wurde aber zurück auf die „nächste Version“ geschoben. Und Dinge wie LINQ to SQL oder LINQ to Entities sind nur möglich, wenn sie Expression-Bäume bekommen, von denen ich glaube, dass sie nicht einmal in der Roadmap enthalten sind. obwohl

bearbeiten

Manche Menschen mit komplexen Bibliotheken kommen haben dieses Verhalten zu simulieren. Viele verwenden "magische Zeichenfolgen", um die Teile der Abfragen auszuführen, für die sie keine vom Compiler überprüften Werte bereitstellen können. LambdaJ Proxy-Objekte verwendet der Compiler denken, dass Sie mit einem Ihrer Objekte arbeiten, die Sie Getter und Setter-Methoden mit der Kompilierung überprüft aufrufen können, so etwas wie folgt aussehen:

List<Person> redBalls = filter(having(
    on(Ball.class).getColor(), equalTo(Color.RED)), 
    balls); 

Diese sehr klug sind, aber niemand kann wirklich die Einfachheit von LINQ zu diesem Zeitpunkt erreichen.