Как бы вы написали этот Java-код в (идиоматических) Scala? - PullRequest
4 голосов
/ 23 декабря 2010
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 ]

12 голосов
/ 23 декабря 2010

Я думаю, что вы попытаетесь избежать постановки проблемы таким образом, но если вы столкнулись с этим, я думаю, что самым ясным было бы что-то вроде

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
)
4 голосов
/ 23 декабря 2010
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

Используя скалас, вы можете использовать функцию map map (∘∘):

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
3 голосов
/ 23 декабря 2010

Слегка модифицированная версия ответа Джеффа

object ScreenParam { 
  def unapply(kv:Tuple2[String, Int]) = 
    if(StringUtils.isNotBlank(request.getParameter(kv._1))) Some(kv._2) else None
}

val conditions = Seq((NEXT_SCREEN_PARAMETER_NAME,1),
                         (PREV_SCREEN_PARAMETER_NAME,-1),
                         (LAST_SCREEN_PARAMETER_NAME,Integer.MAX_VALUE))

conditions.collect{ case ScreenParam(value) => value}.getOrElse(0)
3 голосов
/ 23 декабря 2010

Вы можете сделать что-то вроде:

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, если совпадение не найдено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...