2010-06-23 13 views
17

Ich liebe Google Guava und verwenden Sie es viel, aber es ist eine Methode, die ich mir immer das Schreiben finden ..Warum wirft Itererables.find() in Guava NoSuchElementException, anstatt Null zurückgeben?

public static <T> T tryFind(Iterable<T> iterable, Predicate<T> predicate){ 
    for(T t : iterable){ 
     if(predicate.apply(t)){ 
       return t; 
     } 
    } 
    return null; 
    } 

Für mich scheint für diese Angelegenheit zu Iterators eine sehr sinnvolle Ergänzung zu Iterables (auch als), ich frage mich, warum es fehlt. Auch während ich den Punkt mit einem Verfahren sehen, die NoSuchElementException wirft, vielleicht zwischen der Suche nach einem null und nicht finden, das Elemente zu unterscheiden, diese Situation nur kommt, wenn das Prädikat Sie verwenden ist

public boolean apply(T t){ 
    return t==null; 
} 

die doesn Das scheint kein normaler Fall zu sein.

Warum also haben Guava Designer dieses Verhalten gewählt, anstatt nur null zurück zu geben, wenn es nicht gefunden werden kann? Hier

ist die javadoc für [Iterables.find()] [1]

[1]: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#find(java.lang.Iterable, com.google.common.base.Predicate)

+0

Vielleicht wäre es besser gewesen, eine geprüfte Ausnahme zu werfen Kunden zu verhindern, dass es zu vergessen ... – thSoft

+0

Mögliche Duplikat [Iterables.find und Iterators.find - statt Ausnahme zu werfen, bekommen null] (https: //stackoverflow.com/questions/2543052/iterables-find-and-iterators-find-instate-of-throwing-exception-get-null) – Stewart

Antwort

32

Wir fügen eine weitere Überladung von find() hinzu, die einen Standardwert akzeptiert.

+4

Danke für die tolle Arbeit, Kevin! –

+6

'Iterables.find (iterable, predicate, defaultValue) ':) –

+1

Was ist mit einem Optional tryFind (Iterable iterable, int position)? Manchmal habe ich keinen Standardwert verfügbar und möchte mitteilen, dass der Anrufer meiner API damit umgehen muss. – jontejj

13

wahrscheinlich, weil null eine gültige Rückkehr Wert. Solange es keinen guten Grund gibt, null nicht zu unterstützen, sollte es generell unterstützt werden. Wenn es unterstützt wird, müssen Sie den Fall behandeln, in dem es existiert.

+1

Die Notwendigkeit einer Operation find(), die null zurückgibt, ist höchst fragwürdig. Sicher, wenn Sie wissen, dass wenn Null in der Sammlung überhaupt vorhanden ist, erhalten Sie null zurück, also können Sie auch einfach contains oder eine andere einfachere existierende Methode verwenden. – Trejkaz

4

Anstelle von tryFind() können Sie Filter verwenden und prüfen, ob eine leere Sammlung zurückgegeben wird.

Ich fand, dass das Arbeiten mit Sammlungen immer sauberer ist als das direkte Abfragen von Objekten.

+0

Hm, aber dann werden Sie zweimal iterieren, oder? Ich kann sehen, es ist sauberer, aber .. –

+1

In vielen Fällen wird die Überprüfung dann nicht mehr benötigt und Sie können sofort über die Ergebnisse iterieren. Nichts wird passieren, wenn es keine Ergebnisse gibt, was nach meiner Erfahrung oft das gewünschte Verhalten ist. –

3

Meiner Meinung nach ist die NoSuchElementException besser als eine späte und sehr schwierig zu debuggen NPE ... In den meisten Fällen, wenn Sie ein Objekt in einer "Sammlung" suchen, wissen Sie, dass Sie es wahrscheinlich finden würden. Wenn das Objekt, das Sie suchen, nicht in der "Sammlung" enthalten ist, stehen Sie vor einem außergewöhnlichen Fall ... Laut mir ist das NoSuchElementException-Feedback expliziter als das bedeutungslose "null".

Der Standardwert, der in einer zukünftigen Guava-Version eingeführt wird, wäre eine effiziente Abkürzung, um den Ausnahmefall zu behandeln.

0

Finden würde Sinn machen, wenn es nicht finden würde, eher den Standardwert zu finden.

Optional<T> Iterables.find(Iterable<T>, Predicate<? super T>)