Как уже упоминали другие, описанная вами проблема не может быть решена, потому что вы не можете просто узнать первые 10 чисел из бесконечного потока.Но если вы измените сигнатуру своей функции на
def findTopN(n: Int)(stream: Stream[Int]): Stream[List[Int]]
, то это будет означать, что изменит бесконечный поток случайного числа на бесконечный поток списков из лучших n случайныхчисла , и мы могли бы написать это как:
def findTopN(n: Int)(stream: Stream[Int]): Stream[List[Int]] = {
randomStream.scanLeft(List.empty[Int])((list, next) => {
(next :: list).sorted(Ordering[Int].reverse) match {
case m if m.size > n => m.init
case m => m
}
})
}
val random = Random
val randomStream = Stream.iterate(random.nextInt(1000))(_ => random.nextInt(1000))
findTopN(5)(randomStream).take(10).toList.foreach(println)
И это привело бы к чему-то вроде:
List()
List(868)
List(868, 695)
List(868, 695, 214)
List(868, 695, 453, 214)
List(973, 868, 695, 453, 214)
List(973, 868, 695, 453, 255)
List(973, 868, 695, 453, 271)
List(973, 868, 759, 695, 453)
List(973, 868, 759, 695, 466)
Я думаю, что правильным техническим термином для этого будет вычисление бегаверх N .