2010-03-30 5 views
8

Ich benutze Google-Sammlungen und versuche, das erste Element zu finden, das Prädikat erfüllt, wenn nicht, gib mir 'null' zurück.Iterables.find und Iterators.find - anstatt Ausnahme zu werfen, null erhalten

Leider Iterables.find und Iterators.find löst NoSuchElementException, wenn kein Element gefunden wird.

Nun, ich bin

Object found = null; 
if (Iterators.any(newIterator(...) , my_predicate) 
{ 
    found = Iterators.find(newIterator(...), my_predicate) 
} 

ich durch ‚try/catch‘ und das gleiche tut umgeben kann dazu gezwungen, aber für meine Anwendungsfälle, ich werde viele Fälle begegnen, wo kein Element gefunden.

Gibt es eine einfachere Möglichkeit, dies zu tun?

Antwort

5

Es klingt, als sollten Sie Iterators.filter verwenden und dann den Wert von hasNext für den zurückgegebenen Iterator überprüfen.

0

Ich bin mir nicht sicher, ob dies als einfacher qualifiziert, aber zumindest vermeidet es Ausnahmen und erfordern nur einen Durchlauf über die Quelle iterable:

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(); 
} 
12

Seit Guava 7 können Sie tun dies die Iterables.find() Überlastung verwenden, die einen Standardwert nimmt:

Iterables.find(iterable, predicate, null); 
Verwandte Themen