2010-03-30 5 views
8

J'utilise google-collections et j'essaie de trouver le premier élément qui satisfait Predicate sinon, renvoyez-moi 'null'.Iterables.find et Iterators.find - au lieu de lancer une exception, obtenir la valeur null

Malheureusement, Iterables.find et Iterators.find lancent NoSuchElementException lorsqu'aucun élément n'est trouvé.

Maintenant, je suis obligé de le faire

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

Je peux entourer « try/catch » et faire la même chose mais pour mon cas d'utilisation, je vais rencontrer de nombreux cas où aucun élément est trouvé.

Existe-t-il une façon plus simple de le faire?

Répondre

5

Il semble que vous devriez utiliser Iterators.filter, puis vérifier la valeur de hasNext sur l'itérateur renvoyé.

0

Je ne sais pas si cela est considéré comme plus simple, mais au moins il évite les exceptions et ne nécessite qu'une seule passe sur la source itérables:

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

Depuis Goyave 7, vous pouvez le faire en utilisant la surcharge Iterables.find() qui prend une valeur par défaut:

Iterables.find(iterable, predicate, null); 
Questions connexes