2010-05-17 13 views
5

Say iKann ich eine Liste abfragen? Java

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

haben Wenn someobject ein Feld namens ID enthält. Können wir finden es

durch einige Abfrage wie

objList.filter('id=2');

wihout durch die Liste Looping? Wenn nicht, warum? Dies kann so nützlich Methode sein und als Alternative zu langwierigen For-Schleife verwendet werden?

Nur eine Frage, die mir in den Sinn kam, so dachte ich, dass ich es hier muss klar :)

Vielen Dank im Voraus :)

+0

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

+0

Danke Yuppie. Ihre ist die relevanteste Antwort. – TCM

+1

Sie können objList.select (idEqualTo (2)) verwenden, wenn Sie diese Bibliothek https://github.com/nicholas22/jpropel-light verwenden. Sie müssen die Funktion idEqualTo() definieren, aber es ist ein Einzeiler. –

Antwort

1

Wenn Sie so etwas wie Linq für java wollen Besuche quaere


Edit: An diesem Punkt sieht quaere wie es nicht betreut ist. Da Java 7 EOL ist, sollten Sie sich auf Java 8 befinden, dessen Stream API Sie im Vergleich zur Punktsyntax von Linq am meisten erreichen sollte. Für einige Beispiele siehe this page.

+1

stilvoll, eventuell langsam, enthält implizite Schleife – p4553d

2

Auch wenn diese unterstützte Funktion der Sprache war, dann wäre es Java, das die Iteration durchführen müsste, so dass Sie wieder auf dem ersten Platz sind (hinsichtlich der zeitlichen Komplexität).

Was Sie suchen, ist assoziatives Mapping. Dies kann mit HashMap erreicht werden. Wenn Sie mit mehr als einem Eigenschaftstyp verknüpfen möchten, beispielsweise ID UND Name, können Sie zwei HashMaps erstellen, von denen einer der Schlüssel id und einer der Schlüssel der Name ist.

Dies ist natürlich nicht sehr gut skalieren, wenn Sie für viele Eigenschaften abfragen möchten, so der nächste Schritt würde eine objektorientierte Datenbank wie Hibernate verwenden, mit der Sie die Datenbank nach Objekten genauso abfragen können wie in Ihrem Beispiel.

+0

Nun, ich bin nicht besorgt über die Laufzeit. Ich mache mir mehr Sorgen um meine Programmierzeit (meine Produktivität). Nur ein zusätzlicher Methodenaufruf wird meine Anwendung nicht kläglich verlangsamen. Und ich möchte Hashtable Art der Datenstruktur nicht verwenden. Eigentlich möchte ich etwas ähnliches zu dem, was Linq in .Net bietet, wo Sie eine Sammlung direkt abfragen können – TCM

+0

@Nitesh, Sorry nicht mit .NET vertraut. Aber Sie können eine Sammlung in Java nicht wie in Ihrem Beispiel abfragen (es kann einige Drittanbieter-Frameworks oder Bibliotheken geben, die dies tun). –

2

kurz: Nein, kann man nicht

lang: Sie können für einige effizientere Suche eigene Datenstruktur und Hash/Indexfelder des Objekts schreiben. aber das ist keine Liste mehr HashMap oder so.

8

Bibliotheken mit funktionalen, gut, Funktionalität wie functionaljava bieten solche Methoden.

Sie müssen eine eigene List Implementierung verwenden, die zu nativen Javas (Array)List inkompatibel ist oder zwischen den beiden konvertieren.

Ein Beispiel:

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); 

Durch die Verwendung von functionaljava des List durch aus Ihrem Projekt würden Sie die Umwandlung vermeiden.

2

Wahrscheinlich wird dies jemand helfen,

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

dieser Bibliothek unterstützt folgende Codestruktur,

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