Come funziona l'ordinamento con java 8 stream sotto il cofano?


10

Quando chiamo, Stream.sort(..)viene creato un nuovo array di elementi e il flusso scorre sull'array ordinato appena creato?

In altre parole, come funziona Java 8 Stream sortsotto il cofano?


Perché ottengo un voto negativo con questa domanda ???
Informato il

2
La tua domanda è ragionevole e non merita i voti negativi. I tuoi commenti sulla risposta di Amon , tuttavia ... ugh: |
Andres F.

@AndresF. Il voto negativo è arrivato anche prima che facessi quel commento. È uno dei motivi per cui ero molto turbato.
Informato

I commenti non sono motivo di voto negativo, comunque. La domanda si basa sul suo merito ed è valida secondo me. L'ho votato.
Andres F.

Risposte:


10

Puoi usare grepcode.com per cercare attraverso il codice della libreria standard Java (e alcune altre librerie). Sfortunatamente, il codice di implementazione del flusso è piuttosto astratto. Un buon punto di partenza è la java.util.stream.SortedOpsclasse interna che trasforma un flusso in un flusso ordinato.

L' implementazione corrente (utilizzata per i flussi di contenitori di librerie standard) lo rende non operativo se il flusso è già ordinato, utilizza un array se la dimensione del flusso è nota ( SizedRefSortingSink) o accumula tutti gli elementi in un ArrayList se la dimensione è sconosciuto ( RefSortingSink).

Naturalmente, tali dettagli di implementazione possono cambiare con qualsiasi versione, ma le considerazioni fondamentali sono universali: l'ordinamento di un flusso è necessariamente un'operazione desiderosa / bloccante e l'ordinamento di un flusso infinito non è significativo. Ciò significa che l'ordinamento di un flusso non è utile se si utilizzano flussi perché possono essere pigri, ma si ottiene comunque la sintassi del flusso conveniente.

Altri flussi dovranno fornire la propria implementazione di Stream.sorted(), che sarà probabilmente simile.


1
@InformedA Non voglio suggerire che lambda o ruscelli sarebbero “stronzate sotto il cofano”. Sono entrambi incredibilmente convenienti, anche se i dettagli relativi ai flussi sono insolitamente complessi rispetto ad altri concetti Java. Se vuoi attenersi alla tua idea pre-concepita che questi strumenti siano inutili o dannosi, ti stai limitando inutilmente.
amon,

1
@amon - concordato, inoltre i flussi offrono la possibilità di implementare implementazioni parallele multicore sotto il cofano, senza cambiare virtualmente l'applicazione. E la complessità dell'implementazione del flusso deriva esattamente da questo. È molto più di una semplice comodità, è proprio l'astrazione. All'OP - ti suggerisco di leggere Mastering Lambdas ... se vuoi capire perché lambdas e stream sono molto più che semplici funzionalità.
Yuri Steinschreiber,

3
@InformedA: lambdas esiste da 80 anni ed esiste praticamente in tutti gli attuali linguaggi di programmazione tradizionali. I flussi sono in circolazione da 40 anni e allo stesso modo esistono in quasi tutti i quadri delle collezioni tradizionali. Potrebbero essere chiamati cose diverse (iteratori, liste pigre, enumeratori, enumerabili), ma sono lì. Lambdas e liste pigre sono alcune delle astrazioni più antiche e più stabili che ci siano e sono sopravvissute a ogni nuova moda, hype, paradigma, movimento, metodologia, tecnologia, linguaggio, sistema operativo, framework, libreria lanciati contro di loro. Questo li rende degni di un'occhiata.
Jörg W Mittag,

2
@InformedA Java, il linguaggio di programmazione, è solo un'astrazione di cazzate del bytecode in esecuzione sulla JVM. La stessa JVM è solo un'astrazione di cazzate scritta in C (o C ++, dimentico). C e C ++ sono solo astrazioni di cazzate sul linguaggio assembly. Anche il linguaggio assembly stesso è un'astrazione di cazzate sul microcodice, che è anche un'astrazione di cazzate sui circuiti (ok, potrei mancare qualche passo in mezzo). Si potrebbe dire che tutto ciò che è utile nel software è "un'astrazione di cazzate" su qualcos'altro.
Andres F.

3
@InformedA Il mio onesto consiglio è di provare ad imparare un linguaggio più orientato alla programmazione funzionale rispetto a Java. Anche se non lo usi mai per il tuo lavoro quotidiano, otterrai una comprensione dei linguaggi di programmazione e delle loro scelte di progettazione che ti aiuteranno con Java :)
Andres F.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.