Iterables.find e Iterators.find - em vez de lançar exceção, obtenha nulo
Pergunta
Estou usando o google-collections e tentando encontrar o primeiro elemento que satisfaça o Predicado, caso contrário, retorne-me 'nulo'.
Infelizmente, Iterables.find e Iterators.find lançam NoSuchElementException quando nenhum elemento é encontrado.
Agora, sou forçado a fazer
Object found = null;
if ( Iterators.any( newIterator(...) , my_predicate )
{
found = Iterators.find( newIterator(...), my_predicate )
}
Posso cercar por 'try/catch' e fazer a mesma coisa, mas para meus casos de uso, encontrarei muitos casos em que nenhum elemento será encontrado.
Existe uma maneira mais simples de fazer isso?
Solução
Parece que você deveria estar usando iteradores.
Outras dicas
Desde o Guava 7, você pode fazer isso usando a sobrecarga Iterables.find() que assume um valor padrão:
Iterables.find(iterable, predicate, null);
Isso foi arquivado como uma solicitação de recurso:
http://code.google.com/p/guava-libraries/issues/detail?id=217
Na verdade, estamos em andamento.
Não tenho certeza se isso se qualifica como mais simples, mas pelo menos evita exceções e requer apenas uma passagem pela fonte iterável:
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();
}