2010-05-17 16 views
5

dire che hoPosso interrogare un elenco? Java

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

Se someObject contiene un campo denominato id. Possiamo trovare attraverso qualche domanda come

objList.filter('id=2');

wihout scorrendo la lista? Se no, allora perché? Questo può essere un metodo così utile e utilizzato come alternativa alla scrittura noiosa per il ciclo?

Solo una domanda che mi è venuta in mente così ho pensato che devo cancellarlo qui :)

Grazie in anticipo :)

+0

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

+0

Grazie Yuppie. La tua è la risposta più pertinente. – TCM

+1

È possibile eseguire objList.select (idEqualTo (2)) quando si utilizza questa libreria https://github.com/nicholas22/jpropel-light. Devi definire la funzione idEqualTo() ma è un one-liner. –

risposta

1

Se si desidera qualcosa di simile LINQ per Java, controlla quaere


Edit: A questo punto, quaere sembra che è più mantenuto. Con Java 7 come EOL, dovresti essere su Java 8 il cui Stream API dovrebbe farti ottenere la maggior parte del tempo rispetto alla sintassi del punto di Linq. Vedi this page per alcuni esempi.

+1

elegante, eventualmente lento, contiene loop implicito – p4553d

2

Anche se questa è stata una caratteristica supportata della lingua, allora sarebbe Java che avrebbe dovuto fare l'iterazione, quindi sei tornato al punto di partenza (in termini di complessità temporale).

Quello che stai cercando è la mappatura associativa. Questo può essere ottenuto con HashMap. Se si desidera associare più di un tipo di proprietà, ad esempio ID AND name, è possibile creare due HashMaps, uno con chiave id e uno la cui chiave è name.

Questo naturalmente non si adatta molto bene se si desidera eseguire la query per molte proprietà, quindi il passaggio successivo sarebbe utilizzare un database orientato agli oggetti come Hibernate che consentirà di interrogare il database per oggetti esattamente come nel proprio esempio.

+0

Beh, non sono preoccupato per il tempo di esecuzione. Sono più preoccupato per il mio tempo di codifica (la mia produttività). Solo una chiamata al metodo extra non rallenterà miseramente la mia applicazione. E non voglio usare il tipo di struttura dati Hashtable. In realtà voglio qualcosa di simile a quello che offre Linq in .Net dove puoi interrogare direttamente una collezione – TCM

+0

@Nitesh, Mi dispiace non ho familiarità con .NET. Ma non puoi interrogare una collezione in Java come nel tuo esempio (ci possono essere alcuni framework o librerie di terze parti che fanno questo). –

2

breve: no, non è possibile

lungo: è possibile scrivere una propria struttura di dati e di hash/index campi di oggetto per un po 'di ricerca più efficiente. ma questo non è un elenco, più HashMap o giù di lì.

8

Le librerie con funzionalità funzionali, come ad esempio functionaljava forniscono tali metodi .

È necessario utilizzare la propria implementazione List che non è compatibile con Javas nativo (Array)List o convertire tra i due.

Un esempio:

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

Utilizzando del List functionaljava attraverso fuori del vostro progetto si eviterebbe la conversione.

2

Probabilmente questo vi aiuterà qualcuno,

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

Questo supporta biblioteca seguente struttura del codice,

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