2010-05-17 12 views
5

decir que he¿Puedo consultar una lista? Java

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

Si someObject contiene un campo denominado ID. Podemos encontrar a través de alguna consulta como

objList.filter('id=2');

wihout bucle a través de la lista? Si no, ¿por qué? Este puede ser un método tan útil y usarse como una alternativa para escribir tedioso para el ciclo?

Sólo una pregunta que me vino a la mente lo que pensé que debe aclarar aquí :)

Gracias de antemano :)

+0

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

+0

Gracias Yuppie. La tuya es la respuesta más relevante. – TCM

+1

Puede hacer objList.select (idEqualTo (2)) al usar esta biblioteca https://github.com/nicholas22/jpropel-light. Tienes que definir la función idEqualTo() pero es un juego de una sola línea. –

Respuesta

1

Si quieres algo así como LINQ para Java, echa un vistazo a quaere


Editar: En este punto, quaere parece que es sin mantenimiento. Con Java 7 como EOL, deberías estar en Java 8, cuyo Stream API debería llevarte la mayor parte del camino en comparación con la sintaxis de puntos de Linq. Ver this page para algunos ejemplos.

+1

elegante, finalmente lento, contiene bucle implícito – p4553d

2

Incluso si esto era una característica compatible de la lengua, entonces sería Java que necesitaría hacer la iteración, por lo que está de regreso en el cuadrado uno (en términos de complejidad de tiempo).

Lo que está buscando es mapeo asociativo. Esto se puede lograr con HashMap. Si desea asociar por más de un tipo de propiedad, por ejemplo, identificación Y nombre, puede hacer dos HashMaps, uno cuya clave sea id y otra cuya clave sea su nombre.

Esto, por supuesto, no escala muy bien si desea consultar muchas propiedades, por lo que el siguiente paso sería utilizar una base de datos orientada a objetos como Hibernate que le permitirá consultar la base de datos de objetos exactamente como en su ejemplo.

+0

Bueno, no estoy preocupado por el tiempo de ejecución. Estoy más preocupado por mi tiempo de codificación (mi productividad). Solo una llamada a un método adicional no va a ralentizar miserablemente. Y no quiero usar el tipo de estructura de datos Hashtable. En realidad, quiero algo similar a lo que ofrece Linq en .Net, donde puedes consultar directamente una colección – TCM

+0

@Nitesh, lo siento, no estoy familiarizado con .NET. Pero no puede consultar una colección en Java como en su ejemplo (puede haber marcos de terceros o bibliotecas que lo hagan). –

2

corta: no, no se puede

larga: puede escribir propias estructuras de datos y el hash/índice de campos de objetos por alguna de búsqueda más eficiente. pero esta no es una lista, más HashMap más o menos.

8

Las bibliotecas con funcional, bueno, la funcionalidad como functionaljava proporcionan tales métodos .

Tendría que usar su propia implementación List que es incompatible con el Javas nativo (Array)List o convertir entre los dos.

Un ejemplo:

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

Mediante el uso de List functionaljava a través de su proyecto que evitaría la conversión.

2

Probablemente esto ayude a alguien,

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

esta biblioteca es compatible con el código siguiente estructura,

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