Iterables.find e Iterators.find - em vez de lançar exceção, obtenha nulo

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

  •  23-09-2019
  •  | 
  •  

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?

Foi útil?

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();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top