de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Chris Beach
Chris Beach
Question

Scala: Boolean untuk Pilihan

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.

60 2013-10-30T18:03:24+00:00 9
 om-nom-nom
om-nom-nom
Pertanyaan edit 30 Oktober 2013 в 6:07
Pemrograman
scala
 n1r3
n1r3
30 Oktober 2013 в 6:13
2013-10-30T18:13:14+00:00
Lebih
Sumber
Sunting
#22669537

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
}
59
0
Solution / Answer
Xavier Guihot
Xavier Guihot
17 Januari 2019 в 10:16
2019-01-17T22:16:55+00:00
Lebih
Sumber
Sunting
#22669543

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.

18
0
Brian O'Clair
Brian O'Clair
26 Maret 2015 в 8:20
2015-03-26T20:20:24+00:00
Lebih
Sumber
Sunting
#22669539

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)
16
0
 jazmit
jazmit
28 Desember 2015 в 6:50
2015-12-28T18:50:55+00:00
Lebih
Sumber
Sunting
#22669540

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
15
0
 jazmit
jazmit
28 Desember 2015 в 6:52
2015-12-28T18:52:33+00:00
Lebih
Sumber
Sunting
#22669541

Jika anda don't mind someResult sedang dievaluasi tidak peduli nilai myBool anda juga dapat menggunakan

Some(someResult).filter(myBool)
8
0
J Cracknell
J Cracknell
30 Oktober 2013 в 6:29
2013-10-30T18:29:48+00:00
Lebih
Sumber
Sunting
#22669538

Pilihan lain:

implicit class RichOptionCompanion(val self: Option.type) extends AnyVal {
  def when[A](cond: Boolean)(value: => A): Option[A] = if(cond) Some(value) else None
}

Penggunaan:

Option.when(foo != "bar") { ... }
4
0
 kiritsuku
kiritsuku
30 Oktober 2013 в 6:10
2013-10-30T18:10:22+00:00
Lebih
Sumber
Sunting
#22669536
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.

4
0
 flavian
flavian
30 Oktober 2013 в 6:06
2013-10-30T18:06:30+00:00
Lebih
Sumber
Sunting
#22669535
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
 Suma
Suma
Jawaban edit 25 November 2015 в 8:13
2
0
 Joe
Joe
10 Oktober 2018 в 4:01
2018-10-10T16:01:55+00:00
Lebih
Sumber
Sunting
#22669542

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
Brian Topping
Brian Topping
Jawaban edit 10 Oktober 2018 в 6:52
1
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 2 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi