Sembra essere una cosa molto comune dover dire se qualche elenco o insieme contiene almeno un oggetto che corrisponde a una determinata condizione, eppure la mia ricerca e lettura precedente non ha mai trovato una buona pratica soddisfacente o un modello di progettazione di cui parlare. Nelle situazioni che sto pensando, il solo uso di "contiene" non è sufficiente, poiché il test che vogliamo eseguire non è strettamente basato sul metodo di uguaglianza della classe in questione.
Alcune cose che ho visto:
// for-each with break
private boolean doFoosHaveGoodQuality(List<Foo> candidates) {
boolean foundIt = false;
for (Foo item: candidates) {
if (<< item passes some test >>) {
fountIt = true;
break;
}
}
return foundIt;
}
// while-do with index counter
private boolean doFoosHaveGoodQuality(List<Foo> candidates) {
boolean foundIt = false;
int index = 0;
while(!fountIt && index < candidates.size() - 1) {
Foo item = candidates.get(index++);
if (<< item passes some test >>) {
fountIt = true;
}
}
return foundIt;
}
Entrambi fanno il lavoro e si fermano non appena viene trovato un successo, forse risparmiando un po 'di tempo se siamo fortunati abbastanza per avere l'oggetto desiderato all'inizio della lista. Tuttavia, entrambi richiedono il loop dell'intero elenco per ottenere un risultato falso
Un'altra tecnica che ho visto in alcune circostanze è che allo stesso tempo viene generata la% originale% co_de (cioè recuperata dal database) per generare simultaneamente un List<Foo>
. In questa tecnica, Map<FooKey, Foo>
è una classe aggiuntiva (spesso interna)
tenendo solo quegli attributi di un FooKey
che formano la "qualità desiderata" e sovrascrive i metodi di uguaglianza e codice hash basati su quello. Quando hai bisogno di determinare se esiste un Foo desiderato, fai un'istanza di Foo
esattamente con quella desiderata, quindi chiama new FooKey()
sulla mappa. Extra sforzo in attacco, ma veloce e facile nel momento in cui ne hai bisogno.
Non riesco a metterlo un dito sopra. Ogni idea funziona, ma ognuna sembra un po 'hacky e inefficiente.