Подтвердить что ты не робот

Упростить if (x) Some (y) else None?

Этот общий шаблон выглядит немного подробным:

if (condition) 
  Some(result)
else None

Я думал об использовании функции для упрощения:

def on[A](cond: Boolean)(f: => A) = if (cond) Some(f) else None

Это уменьшает верхний пример до:

on (condition) { result }

Что-то вроде этого уже существует? Или это перебор?

4b9b3361

Ответ 1

Scalaz включает функцию option

import scalaz.syntax.std.boolean._

true.option("foo") // Some("foo")
false.option("bar") // None

Ответ 2

Сначала вы можете создать Option и фильтровать его с помощью вашего условия:

Option(result).filter(condition)

или если condition не связано с result

Option(result).filter(_ => condition)

Ответ 3

Вы можете использовать сопутствующий объект PartialFunction и condOpt:

PartialFunction.condOpt(condition) {case true => result}

Использование:

 scala> PartialFunction.condOpt(false) {case true => 42}
 res0: Option[Int] = None

 scala> PartialFunction.condOpt(true) {case true => 42}
 res1: Option[Int] = Some(42)

Ответ 4

import scalaz._, Scalaz._
val r = (1 == 2) ? Some(f) | None
System.out.println("Res = " + r)

Ответ 5

Вот еще один простой подход:

Option(condition).collect{ case true => result }

Простой пример:

scala> val enable = true
enable: Boolean = true

scala> Option(enable).collect{case true => "Yeah"}
res0: Option[String] = Some(Yeah)

scala> Option(!enable).collect{case true => "Yeah"}
res1: Option[String] = None

Здесь приведены некоторые расширенные небулевые примеры, которые ставят условие в соответствие шаблону:

val param = "beta"
Option(param).collect{case "alpha" => "first"} // gives None

Option(param).collect{case "alpha" => "first"
                      case "beta"  => "second"
                      case "gamma" => "third"} // gives Some(second)

val number = 999
Option(number).collect{case 0 => "zero"
                       case x if x > 10 => "too high"} // gives Some(too high)