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