Вопрос по scala – Упростите, если (x) Некоторые (y) еще Нет?

25

Этот общий шаблон кажется немного многословным:

if (condition) 
  Some(result)
else None

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

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

Это сокращает верхний пример до:

on (condition) { result }

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

Ваш Ответ

6   ответов
4

Начиная,Scala 2.13Option теперь предоставляется сwhen строитель, который делает именно это:

Option.when(condition)(result)

Например:

Option.when(true)(45)
// Option[Int] = Some(45)
Option.when(false)(45)
// Option[Int] = None

Также обратите внимание, что в сочетанииunless метод, который делает противоположное.

1

Вот еще один подход, который довольно прост:

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)
4

Вы можете использовать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)
Это'Это определенно не самый полезный сценарий его использования, но он может помочь во многих других случаях. Nicolas
Это все 42 значит? "Правда"? Можно было бы избежать строительства земли ... ;-)не виделcondOpt раньше спасибо! Tim
Это довольно аккуратно! Определенно нравится этот подход. Посмотрел бы это наOption сопутствующий объект, а неPartialFunction но это неэто действительно важно.👍 Peter Perháč
23

Вы могли бы создатьOption сначала и отфильтруйте это с вашим условием:

Option(result).filter(condition)

или еслиcondition не имеет отношения кresult

Option(result).filter(_ => condition)
результат вычислений является проблемой, думаю, вы можете исправить это с помощьюOption(() => result).filter(_ => condition).map(_()) LuisKarlos
Интересно! Хотя я'Я немного обеспокоен (а) неожиданным (для меня) порядком условия / результата и (б) тенденцией всегда вычислятьresultнужно ли это или нет. Hadn»Впрочем, я не думал об этом! Спасибо! Tim
я использую это время от времени, но мне кажется странным, что нужно оценивать результат, даже если условие ложно ...condition.option(result) и то, что я считаю, оценивается лениво, но это зависит от последствий, и скаляр запрещен там, где я все равно работаю ... Я бы хотел, чтобы это было частью стандартной скалы. Что-то подобноеOption.cond(condition, result) Peter Perháč
17

Scalaz включает в себявариант функция:


true.option("foo") // Some("foo")
false.option("bar") // None
Одна из вещей, которая беспокоила меня о моей функции, заключалась в том, что она неТ четко сигнализировать, что опция была создана. Это и просто, и преодолевает эту проблему. Спасибо! Tim
1
import scalaz._, Scalaz._
val r = (1 == 2) ? Some(f) | None
System.out.println("Res = " + r)
Ах, всегда удобный троичный оператор. Спасибо! Но я надеялся избежать повторного добавления Some () и None. Tim

Похожие вопросы