如何避免在Scala中返回

时间:2018-12-04 10:45:26

标签: scala return coding-style return-value code-cleanup

我有一个这样的例子:

def demo(a: Int, b: Int, c:Int): Int = {
        if (a == 1)
          return 10
        if (b == 2)
          return 20
        if (c == 3)
          return 30
        40
      }

代码运行良好,但是我知道在Scala中,我们尝试避免返回。所以我想请问有什么其他方法可以避免退货? 谢谢

已编辑 这是我的真实情况,我想避免退货。

post("/") {

if (product_id <= 0)
    return BadRequest(Map("ERROR" -> "PRODUCT_ID IS WRONG"))

if (file_id.isEmpty())
    return BadRequest(Map("ERROR" -> "FILE ID NOT FOUND"))

if (data_type.isEmpty())
    return BadRequest(Map("ERROR" -> "FILE TYPE NOT FOUND"))

if (data_type.get != "cvs")
    return BadRequest(Map("ERROR" -> "FILE TYPE IS WRONG"))

OK(Map("SUCCESS" -> "THANK YOU"))
}

2 个答案:

答案 0 :(得分:11)

如果没有,基本选项是使用

if (a == 1) 10 else if (b == 2) 20 else if (c == 3) 30 else 40

另一种选择是使用模式匹配:

def demo(a: Int, b: Int, c: Int): Int = (a, b, c) match {
  case (1, _, _) => 10
  case (_, 2, _) => 20
  case (_, _, 3) => 30
  case _ => 40
}

答案 1 :(得分:0)

您可以对大量参数执行类似的操作:

def demo(ints: Int*) =
  ints.foldLeft((0, 1, 40)) { (acc, i) =>
      if (acc._2 == i && acc._1 == 0) (1, acc._2, i * 10)
      else (acc._1, acc._2 + 1, acc._3)
    }._3

我不确定它是否易于阅读,但是如果您有很多论点,也许应该考虑一下。 一些说明:在foldLeft中,我们以(0,1,40)开头,如果发现返回值,则为0;如果为int,则为索引;为40,是结果;如果发现要返回的另一个值,它将为被替换。如果“演示”只是解释您遇到的另一个问题的简单方法,则应替换条件,并根据您的实际问题得出结果。