2017-02-16 1 views
0

Ich möchte sowas in Scala machen.Scala: Werte an Iterator "von innen" einspeisen

def getFancyIterator: Iterator[Int] = { 
    ... { /// Some arbitrary logic goes here: conditionals, loops, whatever 
    ... { 
     ... { 
     val x = ... 
     // Then at some point I call this: 
     feedNext(x) 
     } 
    } 
    } 
} 

nun von außen alles, was wie normalen Iterator aussehen sollte, so dass ich tun könnte, zum Beispiel:

getFancyIterator.foreach(println) 

Der Trick ist natürlich, dass ich will nicht alles speichern, diese Werte in einer Sammlung zu jedem Zeitpunkt. Mit anderen Worten, ich möchte, dass meine getFancyIterator Funktion die next() Werte des Iterators "on demand" "einspeist".

Ich bin sicher, es muss eine (peinliche) einfache Art und Weise sein, genau das zu tun, aber irgendwie ist es nicht mir in den Sinn kommen ..

UPDATE: Im Grunde möchte ich tun yield x, aber nicht nur von normalen for Schleife, sondern von irgendeinem willkürlichen Stück Code.

+0

Wenn 'feedNext' gibt ein' Iterator [Int] 'Sie sollte in Ordnung sein. Was kommt eigentlich zurück? –

+0

Nein, die gesamte Funktion 'getFancyIterator' gibt zurück und Iterator. 'feedNext' markiert nur den Ort, an dem ich den nächsten Wert für den resultierenden Iterator" einspeisen "möchte. –

+0

Danke für die Bearbeitung, Daniela –

Antwort

0

implementieren Sie einfach die Iterator-Schnittstelle direkt und verwenden next() Ihre feedNext(x) Wert zurückzukehren:

def getFancyIterator: Iterator[Int] = new Iterator[Int] { 
    def hasNext = true //or some other flag to determine when you are done. 
    def next():Int = { 
    //some fancy logic goes here to calculate x 
    1 
    } 
} 
+0

Yeah, ich habe endlich auf etwas wie das zurückgegriffen. Aber meine ursprüngliche Idee war, es rückwärts zu machen - meine ausgeklügelte Logik erzeugt xs und "füttert" sie durch eine spezielle Methode 'feedNext'. Und dann würde der äußere Benutzer des Iterators diese Werte nehmen, wann immer er benötigt, indem er 'next()' auf dem Iterator aufruft. Es ist mir jedoch nicht gelungen, diese Idee umzusetzen. Es könnte wahrscheinlich mit einigen asynchronen Akteuren geschehen, die xs auf Anfrage als Nachrichten senden, aber das wäre für meinen Fall viel zu komplex. –

Verwandte Themen