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?

War es hilfreich?

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top