2017-02-16 8 views
0

Я хочу сделать что-то подобное в Scala.Scala: значения подачи в Iterator «изнутри»

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

Теперь, с внешней стороны все это должно выглядеть как обычный итератора, так что я мог бы сделать, например:

getFancyIterator.foreach(println) 

Хитрость, конечно, что я не хочу, чтобы хранить все эти значения в коллекции в любой момент времени. Другими словами, я хочу, чтобы моя функция getFancyIterator «подавала» значения итератора next() «по запросу».

Я уверен, что должен быть какой-то (ошеломляюще) простой способ сделать это, но почему-то не приходит на ум ..

UPDATE: В сущности, я хочу do yield x, но не только от нормального for петли, но из какого-либо произвольного фрагмента кода.

+0

Если 'feedNext' возвращает' итератор [Int] 'вы должны быть хорошо. Что он действительно возвращает? –

+0

Нет, вся функция 'getFancyIterator' возвращает и итератор. 'feedNext' просто отмечает место, где я хочу« подать »следующее значение результирующему итератору. –

+0

Спасибо за редактирование, Daniela –

ответ

0

Просто реализовать интерфейс итератора напрямую, и использовать next() вернуть feedNext(x) значения:

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

Да, я, наконец, прибегал к чему-то подобному. Однако моя первоначальная идея заключалась в том, чтобы сделать это в обратном направлении - моя фантастическая логика генерирует xs и «кормит» их через специальный метод 'feedNext'. И тогда внешний пользователь итератора будет принимать эти значения всякий раз, когда ему нужно, вызывая 'next()' на итераторе. Однако мне не удалось реализовать эту идею. Вероятно, это может быть сделано с некоторыми асинхронными участниками, отправляющими xs по запросу в виде сообщений, но это было бы слишком сложно для моего дела. –