Saya memiliki Boolean dan ingin menghindari pola ini:
if (myBool)
Option(someResult)
else
None
Apa yang saya'd ingin lakukan adalah
myBool.toOption(someResult)
Saran dengan contoh kode akan lebih dihargai.
Scalaz memiliki cara untuk melakukan itu dengan BooleanOps.pilihan. Yang akan memungkinkan anda untuk menulis :
myBool.option(someResult)
Jika anda don't ingin menambahkan Scalaz ketergantungan, cukup tambahkan kode berikut pada kode anda :
implicit class RichBoolean(val b: Boolean) extends AnyVal {
final def option[A](a: => A): Option[A] = if (b) Some(a) else None
}
Mulai Scala 2.13
, Pilihan
memiliki when
pembangun untuk tujuan yang tepat:
Option.when(condition)(result)
Misalnya:
Option.when(true)(3)
// Option[Int] = Some(3)
Option.when(false)(3)
// Option[Int] = None
Perhatikan juga Option.unless
yang mempromosikan kondisi sebaliknya.
Pilihan().mengumpulkan() adalah pola yang baik untuk hal semacam ini.
Option(myBool).collect { case true => someResult }
dari REPL:
scala> (Option(true).collect { case true => 3 }, Option(false).collect { case true => 3 })
res3: (Option[Int], Option[Int]) = (Some(3),None)
Tidak ada jawaban yang lain menjawab pertanyaan seperti yang dinyatakan! Untuk mendapatkan yang tepat semantik yang anda tentukan menggunakan:
implicit class BoolToOption(val self: Boolean) extends AnyVal {
def toOption[A](value: => A): Option[A] =
if (self) Some(value) else None
}
Anda kemudian dapat menulis
myBool.toOption(someResult)
misalnya:
scala> true.toOption("hi")
res5: Option[String] = Some(hi)
scala> false.toOption("hi")
res6: Option[String] = None
scala> PartialFunction.condOpt(5) { case x if true => x }
res9: Option[Int] = Some(5)
scala> PartialFunction.condOpt(5) { case x if false => x }
res10: Option[Int] = None
Di sini, para penjaga memegang kondisi dan nilai yang diteruskan ke condOpt
adalah nilai yang dikembalikan jika penjaga mengevaluasi ke true.
class RichBool[T](a: Boolean, res:=> T) {
def toOption: Option[T] = if (a) Some(res) else None
}
implicit def boolToRichBool[T](tp: (Boolean, T)): RichBool[T] = new RichBool(tp._1, tp._2);
Ini akan memberikan anda:
(true, 5).toOption // Some(5);
(false, 3).toOption // None
Berikut ini adalah beberapa hal yang saya akan mempertimbangkan:
val bool: Boolean = ???
val result = 1337
Option(bool).withFilter(identity).map(_ => result)
atau
for {
opt <- Option(bool)
if opt
} yield result