Iterables.find y Iterators.find - en lugar de lanzar una excepción, obtener nula

StackOverflow https://stackoverflow.com/questions/2543052

  •  23-09-2019
  •  | 
  •  

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?

¿Fue útil?

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();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top