我是scala的新手,没有if和else语句就无法获得更好的做某事的方法。由于不可变性是scala中的一种实现方式,不建议使用var,因此在不使用var的情况下如何实现以下内容
var requests = callFunc1()
if requests.isEmpty requests = callFunc2()
def callFunc1(): List[Int]
def callFunc2(): List[Int]
答案 0 :(得分:8)
按照列出的要求以及示例中显示的语义进行操作(例如,仅当callFunc1
评估为{{1}时,评估一次callFunc2
,评估一次callFunc1
})以下满足您的要求。
Nil
但是,我认为使用val requests = callFunc1 match {
case Nil => callFunc2
case nonempty => nonempty
}
和一个临时值也没有什么特别的错误。
if
答案 1 :(得分:2)
您可以使用其他容器对其进行过滤,并使用getOrElse:
val requests = Option(func1()).filter(_.nonEmpty).getOrElse(func2())
答案 2 :(得分:1)
如果函数定义固定,那么Martijn的答案非常好。一种替代方法是更改callFunc1
的签名,使其返回Option[List[Int]]
,然后使用
val requests = callFunc1().getOrElse(callFunc2())
def callFunc1(): Option[List[Int]]
def callFunc2(): List[Int]
返回Option
的好处是,您可以区分“我无法读取列表”(None
)和“我读取列表但列表为空”({{1} }。
选择将取决于程序的更广泛的结构,并且取决于Some(List())
的实际操作以及为什么它可能返回空的getFunc1
。例如,如果数据来自List
或Map
操作,则无论如何它都可能包裹在File
中,因此返回Option
也可以简化该代码。
请注意,您可以像这样将Option
转换为List
:
Option[List]
如果Option(list).filter(_.nonEmpty)
为空或None
,它将返回list
,否则将返回null
。