2014-10-26 12 views
14

Come posso ottenere in modo semplice una lista pigra in Kotlin? (Ad esempio, elenco pigro di interi). Ho cercato la documentazione ufficiale, ho cercato su Google senza risultati coerenti. Forse il miglior tutorial che ho trovato è questo: enter link description here, ma mi chiedo se c'è un "modo nativo kotlin" per farlo, o devo implementarlo io stesso con il link che ho appena dato.Elenco pigro nel kotlin?

ho trovato quanto segue sul blog ufficiale di Kotlin, anche se non sono riuscito a ottenere un elemento, con numeri interi [3] per esempio

var i = 0 
integers = iterate{i++} 

integers[3] // does not work 
integers drop 3 // works 
+0

Sembra che l'iterazione sia deprecata, ma anche io posso ottenere un flusso grazie alla funzione streamOf (initialValue, closureForNext). Per quanto riguarda l'operatore delle parentesi, posso avvolgere il mio stream in una classe e implementare un metodo get (indice). Semplice come questo. Potrei "salvare" questa domanda, secondo me. – loloof64

+0

Possibile duplicato di [Definizione ricorsiva di sequenza infinita in Kotlin] (http://stackoverflow.com/questions/35142548/recursive-definition-of-infinite-sequence-in-kotlin) – Vadzim

+2

No. La mia domanda è stata posta prima. – loloof64

risposta

16

Come osservato correttamente, sequenceOf (streamOf() nelle vecchie versioni) è il modo per ottenere un flusso lento di numeri. A differenza di Haskell, non esiste una lista pigra nella libreria standard di Kotlin e per una buona ragione: il significato principale di "elenco" nel mondo Haskell e nel mondo Java è diverso. In Haskell, un elenco è principalmente un elenco collegato, un paio di testa e coda, e l'operazione principale sta prendendo una testa di tale elenco, che è semplice da implementare in modo pigramente efficiente. In Kotlin/Java, list è una struttura di dati con accesso casuale ai suoi elementi e l'operazione principale è get(int), che può essere implementata pigramente, ovviamente, ma le sue prestazioni saranno spesso sorprendenti per l'utente.

Quindi, Kotlin utilizza gli stream per la pigrizia, perché sono utili quando si tratta dei casi d'uso principali delle raccolte pigre: è improbabile che si verifichi molto spesso l'iterazione, il filtraggio, la mappatura e l'accesso casuale.

Come ancora, correttamente, osservare drop consente di accedere agli elementi per indice, il che rende le implicazioni di prestazioni più esplicite nel codice.

BTW, qual è il tuo caso d'uso per le liste pigre?

+0

Sto usando liste pigre per elaborare una funzione di ordine superiore, che calcola i numeri di fibonnaci. Quindi posso andare oltre con questa sequenza di fibonacci: somma di n numeri pari per esempio. – loloof64

+10

Gli stream in Kotlin sono stati sostituiti con 'Sequence' per evitare conflitti con i flussi Java 8. Riferimenti a 'streamOf' con' sequenceOf' o per convertire un'altra raccolta in sequenza 'asSequence' –

+0

Documenti: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/ – Vadzim