2015-04-08 8 views
8

Ho letto Java 8 nell'azione quindi so cosa è Stream e come usarlo. Ma dal punto di vista della scienza informatica, tutti i dati devono essere archiviati in una sorta di struttura dati. Quindi,Che cosa è esattamente lo streaming di Java8?

  1. Come memorizzare Stream?

  2. In che modo Stream può essere in grado di eseguire così tante operazioni per così tanti tipi di raccolte (ad esempio array, elenco collegato, mappa)?

  3. O forse Stream è solo un'interfaccia e sono necessari tutti i tipi di raccolte per implementare queste operazioni specificate in questa interfaccia?

Grazie!

+2

Questo aiuto: http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html? –

+0

@RahulTripathi Sono curioso di implementare Stream – Neo

risposta

5

Una differenza importante con un flusso, se confrontato con una raccolta, è che un flusso è pensato per essere ponderato. Prendi l'estratto dal JavaDoc

Gli stream sono pigri; il calcolo sui dati di origine viene eseguito solo quando viene avviata l'operazione terminale e gli elementi di origine vengono utilizzati solo se necessario.

Avere un'istanza di Stream non garantisce che tutti gli elementi di quel flusso siano noti. Gli elementi del flusso vengono calcolati solo quando sono richiesti. Questo riflette caratteristiche che sono in altri linguaggi funzionali come Haskell o Scala. Dovresti usare un flusso per modellare liste infinite. Ad esempio, un flusso che può calcolare una sequenza di Fibonacci. Calcolerebbe solo sempre gli elementi richiesti. Non calcolerebbe tutti gli elementi, come non avrebbe mai completato.

Quindi, il presupposto che si possa sempre memorizzare il contenuto di un flusso non è corretto. Si memorizzerebbe il contenuto di un flusso solo se fosse un elenco limitato i cui valori sono stati tutti identificati. A quel punto, ci sono pochi motivi per usare un flusso su una raccolta tradizionale.

1

O forse Stream è solo un'interfaccia e sono necessari tutti i tipi di raccolte per implementare queste operazioni specificate in questa interfaccia?

Questo è tutto. Per essere corretti: una raccolta deve implementare un metodo stream che deve essere implementato come spiegato.

Eppure l'interfaccia Stream fornisce alcuni metodi predefiniti. Alcuni provider di streaming eseguono il proprio spazio di archiviazione, ad es. collezioni. Altri non hanno bisogno di spazio di archiviazione, ad es. fornitori di numeri naturali, fornitori di numeri casuali.

+1

Questo non è corretto. Stream e Collection sono astrazioni molto diverse. La raccolta riguarda la memorizzazione e l'accesso ai dati; Lo streaming riguarda le operazioni di calcolo su dati aggregati. Una raccolta può essere una fonte per un flusso, ma può anche essere una funzione generatore o un canale IO, ma questi non sono flussi. –

1

È possibile controllare la fonte per Collection.stream() e vedere come viene gestita. Non c'è magia, è solo un normale codice Java che coinvolge gli oggetti Stream e Spliterators e altre classi correlate.

Stream inoltre non è necessario memorizzare oggetti, poiché sono già memorizzati nello Collection da cui è stato creato lo Stream. Un flusso non parallelo è in realtà abbastanza semplice.