Scala是无限循环的替代方案

Scala是无限循环的替代方案,scala,Scala,对于无限循环,Scala中还有其他功能替代方案吗 while(true) { if (condition) { // Do something } else { Thread.sleep(interval); } } 你可以递归地做 @tailrec def loop(): Nothing = { if (condition) { // Do something } else { Thread.sleep(interval); } loop()

对于无限循环,Scala中还有其他功能替代方案吗

while(true) {
  if (condition) {
    // Do something
  } else {
    Thread.sleep(interval);
  }
}

你可以递归地做

@tailrec
def loop(): Nothing = {
 if (condition) {
  // Do something
  } else {
  Thread.sleep(interval);
  }
  loop()
 }

我猜是无限尾递归:

  @tailrec
  def loop(): Nothing = {
     if (condition) {
       // Do something
     } else {
       Thread.sleep(interval);
     }
     loop()
  }

您可以做的一件事是使用高阶函数,如
流。不断地
,并将其与
配对,以便理解:

import scala.util.Random
import scala.collection.immutable.Stream.continually

def rollTheDice: Int = Random.nextInt(6) + 1

for (n <- continually(rollTheDice)) {
  println(s"the dice rolled $n")
}

您可以看到它的实际应用,并对其进行操作。

为了补充Stefano的伟大答案,如果有人正在寻找像我这样的用例:

我正在处理卡夫卡流课程中的任务,需要创建一个无限的模拟事件流到卡夫卡,其中一些字段是完全随机的(数量),但其他字段在特定的列表(名称)中旋转

连续
相同的方法可用于向其传递方法(通过ETA扩展)并随后遍历有界变量:

  for {record <- continually(newRandomTransaction _)
       name <- List("John", "Stephane", "Alice")} {
    producer.send(record(name))
  }

我认为这将是更合适的类型。是不返回值的对象的类型
Nothing
是永不返回的类型。@JörgWMittag为什么Nothing是“永不返回”?我的理解是,它只是一个底部类型底部类型是一个没有价值的类型。(与具有单个唯一值的单元类型相反)或抛出异常。我认为这是更合适的类型。是不返回值的对象的类型
Nothing
是永不返回的类型。从2.13开始,Stream已被弃用。但是LazyList中也存在相同的方法(import scala.collection.immutable.LazyList.continuoused)
  for {record <- continually(newRandomTransaction _)
       name <- List("John", "Stephane", "Alice")} {
    producer.send(record(name))
  }
  def newRandomTransaction(name: String): ProducerRecord[String, String] = {
   ...
  }