Iterables.find e Iterators.find - invece di gettare eccezione, ottenere nulla

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

  •  23-09-2019
  •  | 
  •  

Domanda

sto usando google-collezioni e cercando di trovare il primo elemento che soddisfa predicato se no, tornare 'null'.

Purtroppo, Iterables.find e Iterators.find getta NoSuchElementException se non si trova alcun elemento.

Ora, io sono costretto a fare

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

posso circondare da 'try / catch' e fare la stessa cosa, ma per i miei casi d'uso, ho intenzione di incontrare molti casi in cui viene trovato nessun elemento.

C'è un modo più semplice di fare questo?

È stato utile?

Soluzione

Sembra che si dovrebbe usare Iterators.filter, quindi controllando il valore della hasNext sul iteratore restituito.

Altri suggerimenti

Dal Guava 7, è possibile farlo utilizzando l'overload Iterables.find () che accetta un valore di default:

Iterables.find(iterable, predicate, null);

Questa è stata presentata come una richiesta di funzionalità:

http://code.google.com/p / guava-biblioteche / emissioni / dettaglio? id = 217

Ci sono in realtà in corso su di esso.

Non sono sicuro se questo si qualifica come semplice, ma almeno evita eccezioni e richiede solo un passaggio sopra la fonte iterabile:

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top