2013-07-12 14 views
5

Sto cercando librerie Java che mi consentano di interrogare raccolte. Mi sono imbattuto in jFilter un JoSql.Libreria Java per interrogare raccolte/oggetti

Tuttavia sembra che JoSql sia stato inattivo dal 2010 e abbia avuto solo 2 rilasci. jFilter sembra essere abbastanza nuovo e non ha avuto nuovi rilasci dall'anno scorso.

Il piccolo numero di risultati di ricerca, quando si cerca su Google uno di loro, mi suggerisce che non sono ampiamente utilizzati.

Hai qualche suggerimento su queste librerie, o sai di più attivo una volta?

+0

Sto usando 'Apache Commons collezioni '(http://commons.apache.org/proper/commons-collections/) e sono felice con questa libreria. Anche 'Guava' (http://stackoverflow.com/a/14979043/1051783) fornisce molte utili API – gunar

+0

Sembra molto probabile che ci sia qualcosa di simile a LINQ in C#. Guava è una buona scommessa quando vuoi fare qualcosa di funzionale come la programmazione. Dipende dall'applicazione dell'utente, ma in genere tutte queste tecniche sono notevolmente più lente rispetto all'iterazione della raccolta. – ssindelar

risposta

4

ho usato CqEngine con successo nella mia azienda (https://code.google.com/p/cqengine/)

Quando si crea un'istanza di una collezione, si può facilmente definire una serie di indici. Questo è molto più potente dei predicati.

Inoltre, quando si eseguirà una ricerca sulla raccolta, CqEngine non eseguirà l'iterazione sull'intera raccolta, quindi controllerà se ogni record corrisponde al predicato. Invece, troverà direttamente i record corrispondenti in una mappa come la struttura dei dati. Quindi avrai prestazioni eccellenti.

+0

CqEngine sembra interessante a dir poco, anche la sintassi sembra più leggibile di jFilter. Tuttavia sembra che sia stato attivo solo per la parte migliore di un anno. Nessuna attività da dicembre 2012 – dngfng

+0

Un lato negativo di CqEngine, a quanto vedo, è che non utilizza la riflessione, mi piace il concetto di definizione degli attributi. Tuttavia odio dover implementare tutti quegli attributi per ogni singolo membro in ogni singolo modello che qualcuno potrebbe voler cercare. – dngfng

+1

CQEngine è attivo! L'ultima versione era a dicembre 2012 solo perché nessuno ha segnalato bug contro quella versione, e fondamentalmente funziona per me come autore. Se le persone segnalano bug, ci sarà attività! In realtà esiste un supporto per la riflessione, vedi [ReflectiveAttribute] (http://cqengine.googlecode.com/svn/cqengine/javadoc/apidocs/com/googlecode/cqengine/attribute/ReflectiveAttribute.html).C'è stata una discussione sulle funzionalità per auto-indicizzare POJO e auto-generare attributi tramite annotazioni nel gruppo di discussione di recente (luglio 2013), quindi questo porterà presto a una nuova versione (probabilmente 1.1). – npgall

2

È possibile cercare Commons Collections e in particolare CollectionUtils.filter(Collection, Filter).

Un'altra opzione sarebbe Google Guava, che ha Iterables.filter(Iterable<T>, Predicate<? super T>).

La scelta è vostra.

+0

Grazie per averlo indicato. Tuttavia, dato che abbiamo a che fare con un framework witch, un intero gruppo di raccolte viene memorizzato nella cache, come nelle tabelle di memoria (è così com'è). Voglio sfuggire alla codifica dei filtri. – dngfng

1

Probabilmente è troppo tardi, ma potrebbe essere utile per qualcun altro, si potrebbe usare,

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

dove sostiene seguente sintassi,

Collection<Dto> testList = new ArrayList<>(); 

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

class Dto 
{ 
    private int id; 
    private String text; 

    public int getId() 
    { 
     return id; 
    } 

    public int getText() 
    { 
     return text; 
    } 
}