你会如何在(惯用)scala中编写这个java代码?

时间:2010-12-23 14:51:28

标签: java scala if-statement

int increment = 0;

if (StringUtils.isNotBlank(request.getParameter(NEXT_SCREEN_PARAMETER_NAME))) {
    increment = 1;
} else if (StringUtils.isNotBlank(request.getParameter(PREV_SCREEN_PARAMETER_NAME))) {
    increment = -1;
} else if (StringUtils.isNotBlank(request.getParameter(LAST_SCREEN_PARAMETER_NAME))) {
  increment = Integer.MAX_VALUE;
}

4 个答案:

答案 0 :(得分:12)

我认为你会尽量避免以这种方式设置问题,但如果这是你必须处理的问题,我认为最清楚的就是

def testParam(s: String) = StringUtils.isNotBlank(request.getParameter(s))
val increment = (
  if (testParam(NEXT_SCREEN_PARAMETER_NAME)) 1
  else if (testParam(PREV_SCREEN_PARAMETER_NAME)) -1
  else if (testParam(LAST_SCREEN_PARAMETER_NAME)) Int.MaxValue
  else 0
)

答案 1 :(得分:4)

val ps = Seq(1 -> NEXT_SCREEN_PARAMETER_NAME,
             -1 -> PREV_SCREEN_PARAMETER_NAME,
             Int.MaxValue -> LAST_SCREEN_PARAMETER_NAME)

val test = StringUtils.isNotBlank(request.getParameter(_ : String))
(ps.view map { case (i,n) => i -> test(n) }) collect { case (i, true) => i } headOption getOrElse 0

使用scalaz,您可以使用地图(∘∘)函数:

ps.∘∘[PartialApply1Of2[Tuple2, Int]#Apply, String, Boolean](test) 
    collect { case (i, true) => i } headOption orZero

与Scalaz一样,scala的类型推断无法推断出部分应用的类型构造函数,这真是一种耻辱。然后你就有了:

(ps ∘∘ test) collect { case (i, true) => i } headOption orZero

答案 2 :(得分:3)

您可以执行以下操作:

val conditions = Seq((NEXT_SCREEN_PARAMETER_NAME,1),
                     (PREV_SCREEN_PARAMETER_NAME,-1),
                     (LAST_SCREEN_PARAMETER_NAME,Integer.MAX_VALUE))
def parameterDefined(p: String) = StringUtils.isNotBlank(request.getParameter(p))
val increment = conditions.find(x => parameterDefined(x._1)).map(_._2).getOrElse(0)

这定义了每个参数的正确增量值,找到第一个定义的参数,如果没有找到匹配,则提取增量值0。

答案 3 :(得分:3)

Geoff答案的略微修改版本