2010-03-30 10 views
8

Używam kolekcji google i próbuję znaleźć pierwszy element, który spełnia predykat, jeśli nie, zwróć mi 'null'.Iterables.find i Iterators.find - zamiast rzucać wyjątek, uzyskaj wartość null

Niestety, Iterables.find i Iterators.find wyrzucają wyjątek NoSuchElementException, gdy żaden element nie zostanie znaleziony.

Teraz jestem zmuszony zrobić

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

mogę otoczyć przez „try/catch” i zrobić to samo, ale dla moich przypadków użycia, mam zamiar spotkać wielu przypadkach nie-elementu jest znalezione.

Czy jest to prostszy sposób?

Odpowiedz

5

Wygląda na to, że powinieneś używać Iterators.filter, a następnie sprawdzić wartość hasNext na zwróconym iteratorze.

0

Nie jestem pewien, czy to kwalifikuje się jako prostsze, ale przynajmniej unika wyjątki i wymaga tylko jednego podaniem źródła iterowalny:

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

Od Guava 7, można to zrobić za pomocą Iterables.find (przeciążenie), która przyjmuje wartość domyślną:

Iterables.find(iterable, predicate, null); 
Powiązane problemy