2016-03-28 12 views
5

Jestem zdezorientowany, jak stworzyć nieskończoną sekwencję w kotlinach, która posłuży do leniwego oceniania.nieskończone sekwencje kotlin z funkcją iteratora

w Javie:

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

ale sekwencje wydają się znacznie bardziej skomplikowane następnie strumienie Java. Konstruktor sekwencja jest bardzo mylące doc na to mówi:

/** 
* 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. 
*/ 

ale nie wiem co to znaczy przez iterator lub jak zrobić jeden.

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

Mam to, co kompiluje, ale oczywiście nic nie drukuje. Nie sądzę, że moja funkcja iteratora ma sens. Chce funkcji, która nie przyjmuje argumentów i zwraca iterator, który w niczym nie przypomina funkcji Java .iterate. iterator ma konstruktor pobierający tablicę, co miałoby sens, gdybym miał zestaw danych do pracy z tablicą, ale ja nie. Chcę pracować z nieskończoną sekwencją.

Nie ma końcówki .limit, więc wcześniej próbowałem dodać .reduce, ale argumenty dla .reduce były jeszcze bardziej mylące. Myślę, że powinien istnieć .toList, ale wiedziałem, że to nie działa, więc nie próbowałem tego.

Jeśli ktoś pokaże mi, jak wdrożyć powyższy kod java w Lotlin, bardzo by to pomogło.

Odpowiedz

15

Można użyć generateSequence metody fabryki:

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

lub ograniczonej przypadku:

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