Iterables.find y Iterators.find - en lugar de lanzar una excepción, obtener nula
Pregunta
Estoy usando google-colecciones y tratando de encontrar el primer elemento que satisface predicado si no, 'nulo' retorno.
Por desgracia, Iterables.find y Iterators.find lanza NoSuchElementException cuando no se encuentra ningún elemento.
Ahora, me veo obligado a hacer
Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
found = Iterators.find( newIterator(...), my_predicate )
}
Me puede rodear por 'try / catch' y hacer lo mismo pero para mis casos de uso, voy a encontrar muchos casos en los que no se encuentra un elemento.
¿Hay una manera más sencilla de hacer esto?
Solución
Parece que usted debe utilizar Iterators.filter, a continuación, comprobar el valor de hasNext en el iterador devuelto.
Otros consejos
Desde guayaba 7, puede hacerlo utilizando la sobrecarga de Iterables.find () que toma un valor por defecto:
Iterables.find(iterable, predicate, null);
Esta fue presentada como una solicitud de función:
http://code.google.com/p / guayaba-bibliotecas / temas / detalle? id = 217
En realidad estamos en curso sobre el mismo.
No estoy seguro si esto califica como más simple, pero al menos evita excepciones y sólo requiere un paso sobre la fuente 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();
}