从方法构建和返回列表的最佳方法

时间:2013-06-14 19:57:29

标签: scala scala-2.10

是否有用于构建和返回列表的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中有类似的内容吗?

1 个答案:

答案 0 :(得分: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],则使用yield是一种有效的方法:

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

此外,使用Vector通常优于List

相关: