1

是否有用于构建和返回这样的列表的 Scala 构造?

def getOutput(isValidInput: Boolean): List[Output] =
  if (isValidInput) {
    yield Output(1) // Pseudo-code... I know yield is not intended for this!
    yield Output(2)
  }

代替...

def getOutput(isValidInput: Boolean): List[Output] =
  if (isValidInput)
    List(Output(1), Output(2))
  else
    Nil

在 C# 中使用 'yield' 允许您返回惰性求值的集合 - 在 Scala 中有类似的东西吗?

4

1 回答 1

1

如果您想要一个惰性序列,请使用Stream

case class Output(value: Int)

def getOutput(isValidInput: Boolean):Stream[Output] = getOutput(isValidInput, 1)

def getOutput(isValidInput: Boolean, index: Int):Stream[Output] =
  if (isValidInput && index < 3) {
    println("Index: " + index)
    Output(index) #:: getOutput(isValidInput, index+1)
  } else {
    Stream.empty[Output]
  }

println("Calling getOutput")
val result: Stream[Output] = getOutput(true)
println("Finished getOutput")

result foreach println

这导致:

Calling getOutput
Index: 1
Finished getOutput
Output(1)
Index: 2
Output(2)

如果您想将返回类型保持为List[Output], usingyield是一种有效的方法:

def getOutput(isValidInput: Boolean):List[Output] =
  if (isValidInput) {
    (for (i <- 1 until 3) yield Output(i))(collection.breakOut)
  } else {
    List.empty[Output]
  }

此外,使用 aVector通常比 a 更可取List

有关的:

于 2013-06-14T20:37:48.613 回答