2010-05-17 5 views
5

dire que j'aiPuis-je interroger une liste? Java

List<SomeObject> objList = new ArrayList<SomeObject>(); 

Si someObject contient un champ id nommé. Peut-on trouver dans une requête comme

objList.filter('id=2');

wihout en boucle dans la liste? Si non, alors pourquoi? Cela peut être une méthode si utile et utilisé comme une alternative à l'écriture fastidieuse pour la boucle?

Juste une question qui me vint à l'esprit si je pensais que je dois effacer ici :)

Merci d'avance :)

+0

Voir http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection – YuppieNetworking

+0

Merci Yuppie. La vôtre est la réponse la plus pertinente. – TCM

+1

Vous pouvez faire objList.select (idEqualTo (2)) en utilisant cette bibliothèque https://github.com/nicholas22/jpropel-light. Vous devez définir la fonction idEqualTo() mais c'est un one-liner. –

Répondre

1

Si vous voulez quelque chose comme LINQ pour Java, consultez quaere


Edit: A ce stade, quaere ressemble il est unmaintained. Avec Java 7 étant EOL, vous devriez être sur Java 8 dont Stream API devrait vous obtenir la plupart du temps là par rapport à la syntaxe de point de Linq. Voir this page pour quelques exemples.

+1

élégant, éventuellement lent, contient une boucle implicite – p4553d

2

Même si cela était une fonctionnalité prise en charge de la langue, il serait alors Java qui aurait besoin de faire l'itération, de sorte que vous êtes de retour à la case départ (en termes de complexité temporelle).

Ce que vous cherchez est la cartographie associative. Cela peut être réalisé avec HashMap. Si vous souhaitez associer plusieurs types de propriété, par exemple id AND name, vous pouvez créer deux HashMaps, l'un dont la clé est id et l'autre dont la clé est name. Bien sûr, cela ne s'adapte pas très bien si vous voulez interroger de nombreuses propriétés. La prochaine étape consistera à utiliser une base de données orientée objet telle que Hibernate qui vous permettra d'interroger la base de données pour les objets exactement comme dans votre Exemple.

+0

Eh bien, je ne suis pas préoccupé par le temps de course. Je suis plus préoccupé par mon temps de codage (ma productivité). Juste un appel de méthode supplémentaire ne va pas lamentablement ralentir mon application. Et je ne veux pas utiliser le type de structure de données Hashtable. En fait, je veux quelque chose de similaire à ce que propose Linq dans. Net où vous pouvez interroger directement une collection – TCM

+0

@Nitesh, Désolé pas familier avec .NET. Mais vous ne pouvez pas interroger une collection en Java comme dans votre exemple (il peut y avoir des frameworks tiers ou des bibliothèques qui le font). –

2

courte: non, vous ne pouvez pas

longue: vous pouvez écrire propre structure de données et champs hachage/index de l'objet pour une recherche plus efficace. mais ce n'est pas une liste, plus HashMap ou plus.

8

Des bibliothèques avec des fonctionnalités fonctionnelles telles que functionaljava fournissent ces méthodes .

Vous devez utiliser sa propre implémentation List qui est incompatible avec Java natif (Array)List ou convertir entre les deux.

Exemple:

import fj.data.Java 
import fj.data.List 
import fj.F 

// Converting an ArrayList 
fj.data.List<SomeObject> objList2 = Java.ArrayList_List().f(objList); 

fj.data.List<SomeObject> filteredObjList = objList2.filter(new F<SomeObject, Boolean>() { 
    Boolean f(SomeObject c) { return c.id == 2; } 
}); 

// Converting back to ArrayList 
java.util.List<SomeObject> objList2 = Java.List_ArrayList().f(filteredObjList); 

En utilisant List de functionaljava à travers de votre projet, vous éviterait la conversion.

2

Probablement cela vous aidera quelqu'un,

http://code.google.com/p/joquery/

ce support de bibliothèque suivant la structure du code,

Filter<Dto> query = CQ.<Dto>filter(testList) 
    .where() 
    .property("id").eq().value(1); 
Collection<Dto> filtered = query.list(); 
Questions connexes