2016-03-28 11 views
5

Sono confuso su come creare una sequenza infinita in kotlin da utilizzare per la valutazione lazy.kotlin sequenze infinite con funzione iteratore

in Java:

IntStream.iterate(0, i -> i + 2) 
    .limit(100) 
    .forEach(System.out::println); 

ma sequenze sembrano molto più confusa allora flussi java. Il costruttore di sequenza è molto confusa il doc perché dice:

/** 
* Given an [iterator] function constructs a [Sequence] that returns values through the [Iterator] 
* provided by that function. 
* The values are evaluated lazily, and the sequence is potentially infinite. 
*/ 

ma non so cosa vuol dire da una funzione iteratore o come fare uno.

Sequence { iterator(arrayOf<Int>()) } 
     .forEach { print(it) } 

Ho questo che compila ma ovviamente non stampa nulla. Non penso che la mia funzione di iteratore abbia senso. Vuole una funzione che non accetta argomenti e restituisce un iteratore, che non è affatto la funzione java .iterate. iterator capita di avere un costruttore che accetta un array, il che avrebbe senso se avessi un set di dati con cui lavorare in un array, ma non lo faccio. Voglio lavorare con una sequenza infinita.

Non c'è alcun limite, quindi in precedenza ho provato ad aggiungere un .reduce ma gli argomenti per .reduce erano ancora più confusi. Penso che ci dovrebbe essere un .Lista ma sapevo che non funzionava, quindi non l'ho provato.

Se qualcuno mi mostrasse come implementare il codice java sopra in lotlin, sarebbe di grande aiuto.

risposta

15

È possibile utilizzare generateSequence metodo factory:

generateSequence(0) { it + 2 }.forEach { println(it) } 

o per il caso limite:

generateSequence(0) { it + 2 }.take(100).forEach { println(it) }