Iterables.find und Iterators.find - statt Ausnahme zu werfen, get null
Frage
Ich verwende Google-Sammlungen und versuche, das erste Element zu finden, dass Prädikat erfüllt, wenn nicht, kehrt mich ‚null‘.
Leider Iterables.find und Iterators.find wirft NoSuchElementException, wenn kein Element gefunden wird.
Nun bin ich gezwungen, zu tun
Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
found = Iterators.find( newIterator(...), my_predicate )
}
kann ich umgeben von ‚try / catch‘ und das gleiche tun, aber für meine Anwendungsfälle, ich werde vielen Fällen begegnen, wo noch kein Element gefunden wird.
Gibt es einen einfacheren Weg, dies zu tun?
Lösung
Es klingt wie sollten Sie Iterators.filter verwenden, dann wird der Wert von hasNext Überprüfung auf der Iterator zurückgegeben.
Andere Tipps
Da Guava 7 können Sie tun dies die Iterables.find () Überlastung verwenden, die einen Standardwert nimmt:
Iterables.find(iterable, predicate, null);
Dies wurde als Feature-Request abgelegt:
http://code.google.com/p / Guave-Bibliotheken / Themen / detail? id = 217
Wir sind tatsächlich im Gang auf sich.
Ich bin mir nicht sicher, ob dies gilt als einfacher, aber zumindest vermeidet es Ausnahmen und erfordert 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();
}