반응형
스칼라 : 부울에서 옵션으로
부울이 있고이 패턴을 피하고 싶습니다.
if (myBool)
Option(someResult)
else
None
내가하고 싶은 것은
myBool.toOption(someResult)
코드 예제에 대한 모든 제안을 주시면 감사하겠습니다.
시작 Scala 2.13, Option한 when이 정확한 목적을 위해 빌더 :
Option.when(condition)(result)
예를 들면 :
Option.when(true)(3)
// Option[Int] = Some(3)
Option.when(false)(3)
// Option[Int] = None
또한 Option.unless반대 조건을 조장하는 것에 유의하십시오 .
Scalaz에는 BooleanOps.option 으로이를 수행하는 방법이 있습니다 . 그러면 다음과 같이 작성할 수 있습니다.
myBool.option(someResult)
Scalaz 종속성을 추가하지 않으려면 코드에 다음을 추가하십시오.
implicit class RichBoolean(val b: Boolean) extends AnyVal {
final def option[A](a: => A): Option[A] = if (b) Some(a) else None
}
Option (). collect ()는 이런 종류의 일에 좋은 패턴입니다.
Option(myBool).collect { case true => someResult }
REPL에서 :
scala> (Option(true).collect { case true => 3 }, Option(false).collect { case true => 3 })
res3: (Option[Int], Option[Int]) = (Some(3),None)
다른 답변은 언급 된대로 질문에 대한 답변이 없습니다! 지정한 정확한 의미를 얻으려면 다음을 사용하십시오.
implicit class BoolToOption(val self: Boolean) extends AnyVal {
def toOption[A](value: => A): Option[A] =
if (self) Some(value) else None
}
그런 다음 쓸 수 있습니다.
myBool.toOption(someResult)
예 :
scala> true.toOption("hi")
res5: Option[String] = Some(hi)
scala> false.toOption("hi")
res6: Option[String] = None
당신 someResult의 가치에 상관없이 평가받는 것을 신경 쓰지 않는다면 myBool또한 사용할 수 있습니다
Some(someResult).filter(myBool)
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
여기서 가드는 조건을 보유하고 전달 condOpt된 값은 가드가 참으로 평가되면 반환되는 값입니다.
다른 선택 :
implicit class RichOptionCompanion(val self: Option.type) extends AnyVal {
def when[A](cond: Boolean)(value: => A): Option[A] = if(cond) Some(value) else None
}
용법:
Option.when(foo != "bar") { ... }
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);
이것은 당신에게 줄 것입니다 :
(true, 5).toOption // Some(5);
(false, 3).toOption // None
고려해야 할 몇 가지 사항은 다음과 같습니다.
val bool: Boolean = ???
val result = 1337
Option(bool).withFilter(identity).map(_ => result)
또는
for {
opt <- Option(bool)
if opt
} yield result
참고 URL : https://stackoverflow.com/questions/19690531/scala-boolean-to-option
반응형
'Program Club' 카테고리의 다른 글
| 단일 프로세서 시스템에서 멀티 스레딩을 구현할 수 있습니까? (0) | 2020.12.11 |
|---|---|
| express.js에서 요청을 시작한 도메인을 얻으려면 어떻게해야합니까? (0) | 2020.12.11 |
| Jenkins 빌드를 원격으로 트리거하고 매개 변수를 전달하는 방법 (0) | 2020.12.11 |
| Akka 배우의 Forward와 Tell의 차이점 (0) | 2020.12.11 |
| 브라우저 시간 초과 (0) | 2020.12.09 |