2010-12-13 5 views
1

J'ai de l'expérience en programmation C#, mais j'ai besoin de changer quelque chose dans le projet Java, alors ma question est: Y A-T-IL DANS JAVA QUELQUE SIMPLE LINQ IN C#? Je dois interroger des listes en Java.Linq like for Java

+0

pas vraiment la même chose ... la question "LINQ for Java tool" est plutôt une question d'étude de marché. – CrazyDart

+0

Utiliser la bibliothèque LAMBDAJ. – Zasz

+1

Cochez cette case: github.com/nicholas22/jpropel-light, exemple réel: new String [] {"james", "john", "john", "eddie"} .where (startsWith ("j")). toList(). distinct(); –

Répondre

0

Rien ne ressemble à LINQ pour Java. Pardon. En recherchant sur Google, j'ai trouvé this project mais bien sûr vous ne pouvez pas attendre la même intégration dans la langue ou un sucre syntaxique que vous pourriez obtenir en C#.

5

Cela dépend de ce que vous voulez faire, exactement. La notion de notation lambda de C# peut être imitée de façon beaucoup plus verbeuse en utilisant des classes anonymes. Vous pouvez donc créer une méthode Where qui prend un Function<T, bool>, où Function<T1, TReturn> est une classe qui a une seule méthode (par exemple Execute). Je comprends que Guava a quelque chose comme ça.

L'idée serait de dire alors quelque chose comme ceci:

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

Mais pour tout ce travail, vous pourriez aussi bien avoir fait sans Linq:

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

Malheureusement, il est loin Criez de ce que vous pouvez faire lorsque vous combinez des expressions lambda, des types déduits, des propriétés et des méthodes d'extension, comme le fait C#.

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

code comme celui-ci ne sera possible que lorsque Java implémente des expressions lambda, qui était prévu pour la version 7, mais a été repoussée en arrière à la « prochaine version ». Et des choses comme LINQ to SQL ou LINQ to Entities ne seront possibles que si elles obtiennent des arbres Expression, ce qui ne me semble même pas dans la feuille de route.

Modifier

Certaines personnes ont trouvé des bibliothèques complexes pour simuler ce comportement, cependant. Beaucoup utilisent des "chaînes magiques" pour exécuter les parties des requêtes qu'elles ne peuvent pas fournir de valeurs vérifiées par le compilateur. LambdaJ utilise des objets proxy pour faire le compilateur pense que vous travaillez avec un de vos objets, ce qui vous permet d'appeler getter et setter avec des contrôles de compilation, à la recherche quelque chose comme ceci:

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

Ils sont très intelligents, mais aucun ne peut vraiment correspondre à la simplicité de LINQ à ce stade.