2013-11-26 3 views
0

Say Я использую выражение матч, чтобы проверить значение, которое может или не может быть в объекте на карте следующим образом:Scala избежать дублирования кода

map.get(key) match { 
    case Some(value) if (cond1(value)) => res1(value) 
    case Some(value) if (cond2(value)) => res2() 
    case None => res2() 
    case _ => // None of the above 
} 

Как вы можете видеть, что я хочу, чтобы вызвать res2 в любом случае, когда у меня есть значение для моего ключа, и оно соответствует условию 2 или у меня нет значения для ключа. Может ли кто-нибудь предложить лучшую конструкцию, которая позволит избежать дублирования вызовов res2() в примере выше?

Благодаря Des

* К сожалению, я понял, что пример кода не совсем правильно и соответствующим образом обновлены. Я только хочу вызвать res2 в случае, когда значение для ключа соответствует cond2 ИЛИ нет записи для ключа.

ответ

0

Без Gard, если это только возможности:

case Some(value) => if (cond1(value)) res1(value) else res2() 
1

Я считаю, что вы хотите:

map.get(key) match { 
    case Some(value) if (cond1(value)) => res1(value) 
    case o: Option[String] if (o.forall(cond2)) => res2() 
    case _ => 
} 

замещающие [String] с любым типом key есть.

Имена методов на Option не всегда являются наиболее очевидными; в поддержании функциональной чистоты они жертвуют ясностью для нас, неграмотных. В этом случае scaladoc for Option говорит нам, что ForAll:

возвращает истину, если этот параметр пуст или предикат р возвращает истину применительно к значению этого scala.Option в.

+1

Это лучший ответ, если ОП не ожидает побочных эффектов от 'cond2', который он не должен. – yan

+0

OP обновил свой вопрос и сделал этот ответ недействительным: он хочет вызвать 'res2()', если значение, связанное с 'key', соответствует' cond2', или нет значения, связанного с 'key'. Этот ответ также называет его, если есть значение, связанное с 'key', которое не соответствует ни условию' cond1', ни 'cond2'. –

+0

@ user79074 Ответить обновлено, чтобы соответствовать обновленному вопросу. –

Смежные вопросы