2014-07-14 12 views
6

Così ho lavorato abbastanza a lungo con l'API Neo4j, e ho notato che quasi sempre avranno funzioni che restituisconoQuando restituire Iterable <String> anziché List, Set, Collection?

Iterable<Class> 

mentre io ho sempre capito che è meglio tornare uno dei Set, List o Raccolta a meno che non si abbia una ragione convincente per fare diversamente. Impostare per indicare all'utente che non avrà mai elementi duplicati, Elenco quando l'ordine è importante o contiene duplicati, o Raccolta quando non si dispone di una politica.

Preferisco questi a Iterable in quanto hanno utilità utili come .contains(), .add() ecc. Ho trovato che molto spesso devo scrivere codice per convertire un Iterable in una Collection.

Quindi la mia domanda è: mi manca qualcosa di importante? C'è una buona ragione per usare Iterable su Collection? Quando lo faresti? Ovviamente, i ragazzi di Neo4j sembrano essere dei programmatori di prim'ordine, quindi presumo che abbiano una ragione per questo, ma non riesco a vederlo.

risposta

8

Questo significa semplicemente che ti stanno dando qualcosa per iterare sopra. Non stanno facendo promesse su ciò che è implementato sotto le copertine.

In particolare, potrebbe non esserci una vera classe di raccolta dietro questo. Gli elementi possono essere valutati e/o recuperati pigramente mentre si scorre su di essi (immagina come potresti restituire una collezione di elementi, ad esempio 100M). In tal caso, è meglio che tu stia attenta a raccogliere tutti gli elementi in una collezione reificata, dal momento che sarà piuttosto consistente.

Poiché Neo4J è un database grafico, ha senso. È analogo a un JDBC ResultSet, in cui non si ottiene una raccolta di risultati, ma piuttosto una riga per riga, e se si vuole veramente contenere tutti i risultati, è necessario creare una raccolta in modo esplicito.

+1

Sì, si tratta principalmente della valutazione pigra dei risultati. Le classi di raccolta sono tutte impazienti. In realtà Iterable è solo zucchero sintattico per un 'Interator' per permettere di usare il singolo iteratore all'interno di un foreach –

Problemi correlati