Iterables.find e Iterators.find - invece di gettare eccezione, ottenere nulla
Domanda
sto usando google-collezioni e cercando di trovare il primo elemento che soddisfa predicato se no, tornare 'null'.
Purtroppo, Iterables.find e Iterators.find getta NoSuchElementException se non si trova alcun elemento.
Ora, io sono costretto a fare
Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
found = Iterators.find( newIterator(...), my_predicate )
}
posso circondare da 'try / catch' e fare la stessa cosa, ma per i miei casi d'uso, ho intenzione di incontrare molti casi in cui viene trovato nessun elemento.
C'è un modo più semplice di fare questo?
Soluzione
Sembra che si dovrebbe usare Iterators.filter, quindi controllando il valore della hasNext sul iteratore restituito.
Altri suggerimenti
Dal Guava 7, è possibile farlo utilizzando l'overload Iterables.find () che accetta un valore di default:
Iterables.find(iterable, predicate, null);
Questa è stata presentata come una richiesta di funzionalità:
http://code.google.com/p / guava-biblioteche / emissioni / dettaglio? id = 217
Ci sono in realtà in corso su di esso.
Non sono sicuro se questo si qualifica come semplice, ma almeno evita eccezioni e richiede solo un passaggio sopra la fonte iterabile:
public static <T> T findMatchOrNull(Iterator<T> source, Predicate<T> pred) {
Iterator<T> matching = Iterators.filter(source, pred);
Iterator<T> padded = Iterators.concat(matching, Iterators.<T>singletonIterator(null));
return padded.next();
}