在Scala中处理无效参数的最佳方法是什么

时间:2019-05-02 11:09:11

标签: scala

我正在编写一个带有请求对象的函数,可以通过多种方式配置请求,但是只有一种有效的形式,因此在执行功能之前,我想测试一下对象的配置方式。如果我是用Java编写的,我会写这样的东西:

static void func(Request request) {
  if (condition1)
    return false

  if (condition 2)
    return false

  if (condition 3)
    return false

  request.process()
  return true
}

但是在scala中,为了避免使用return,我通常会得到以下结果:

static void func(Request request) {
    if (!condition1) {
        if (!condition 2) {
            if (!condition 3) {
                request.process()
                return true
            }
            else
                return false
        }
        else
            return false
    }
    else
      return false
}

这是一种简化形式,通常在条件1之后,然后在条件2之后,我需要做一些事情,这意味着我不能只将条件组合成一个if语句(例如,条件1检查某物不为空,则条件2检查该物的值是否有效。

我想知道的是如何在保持这些检查到位的情况下使代码更清晰易读?

3 个答案:

答案 0 :(得分:4)

您可以使用模式匹配

request match {
    case _ if (condition1 || condition2 || condition3) => false
    case _ => request.process(); true
}

答案 1 :(得分:4)

在Scala中,通常返回Option[value]而不是返回true / false并依赖副作用。 Request对象通常是纯数据,由外部函数完成处理。

因此典型的Scala函数可能如下所示:

def func(req: Request): Option[Result] =
  req match {
    case Request(a, _, _) if condition1(a) => None
    case Request(_, b, _) if condition2(b) => None
    case _ =>
      Some(processRequest(req))
  }

答案 2 :(得分:2)

如果只是简化条件,您可以做一个简单的事情。

def func(request: Request) {
    if (condition1 || condition2 || condition3)
        false
    else {
        request.process()
        true
    }
}