Scala:如何在不使用var的情况下实现以下内容

时间:2018-12-17 08:43:36

标签: scala

我是scala的新手,没有if和else语句就无法获得更好的做某事的方法。由于不可变性是scala中的一种实现方式,不建议使用var,因此在不使用var的情况下如何实现以下内容

var requests = callFunc1()
if requests.isEmpty requests = callFunc2()

def callFunc1(): List[Int]
def callFunc2(): List[Int]

3 个答案:

答案 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。例如,如果数据来自ListMap操作,则无论如何它都可能包裹在File中,因此返回Option也可以简化该代码。

请注意,您可以像这样将Option转换为List

Option[List]

如果Option(list).filter(_.nonEmpty) 为空或None,它将返回list,否则将返回null