我正在编写一个带有请求对象的函数,可以通过多种方式配置请求,但是只有一种有效的形式,因此在执行功能之前,我想测试一下对象的配置方式。如果我是用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检查该物的值是否有效。
我想知道的是如何在保持这些检查到位的情况下使代码更清晰易读?
答案 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
}
}