2013-02-17 2 views
1

옵션에서 매핑 할 때 잠재적으로 null 결과를 다른 옵션으로 래핑하지 않아도되는 방법이 있습니까?스칼라 옵션 다른 옵션으로 매핑

option.optionMap(arg => arg.somePotentiallyNullValue) 

같은

option.flatMap(arg => Option(arg.somePotentiallyNullValue)) 

예 : 뭔가 난 그냥 영원히 추가 옵션 전화에지도의 결과를 포장 의미 우리의 코드베이스에서 자바 코드를 많이 가지고있다.

+0

어쩌면을 (옵션) 모나드. –

답변

3

nullable 형식에서 Option으로의 암시 적 변환은 어떻게됩니까? 영역이 어디를 선언

implicit def toOption[T](x: T) : Option[T] = Option(x) 

후에 컴파일러가 알아낼 것이다

option.flatMap(_.somePotentiallyNullValue) 

flatMap 때문에이 결과 값 Option[T] 기대, 컴파일러 toOption 암시 적 변환이 같은 사용

option.flatMap(arg => toOption(arg.somePotentiallyNullValue)) 
1

Option의 공장 방법은 nullNone :

scala> implicit def nullable2Option[T >: Null](t: T): Option[T] = if (t == null) None else Some(t) 
warning: there were 1 feature warnings; re-run with -feature for details 
nullable2Option: [T >: Null](t: T)Option[T] 

scala> val os2: Option[String] = "foo" 
os2: Option[String] = Some(foo) 

scala> val nullS: String = null 
nullS: String = null 

scala> val os3: Option[String] = nullS 
os3: Option[String] = None 

: 당신은 신중하게 그 범위를 제한 할 경우, 암시 적 변환을 사용할 수 있습니다

내가 질문을 오해 할 수

...

scala> val os1: Option[String] = Option(null) 
os1: Option[String] = None 

부록 컴파일러가 nullabl 값을 연결하려고 시도 할 때 사용할 수있는 유형 정보가있을 때마다이 작업이 수행됩니다 e 유형을 Option으로 변경하십시오. 예를 들어 메소드를 호출 할 때 (유형이 항상 명시적인 경우). 당신이 새로운 유형의 도입 수보다 쉽게 ​​일을하기 위해

1

: 당신이 옵션 인스턴스를 사용하여 코드에 다음

implicit class CheckedOption[T](val option:Option[T]) 

object CheckedOption { 
    @inline implicit def toOption[T](checkedOption:CheckedOption[T]):Option[T] = 
    checkedOption.option.flatMap(Option.apply) 
} 

을 당신이 뭔가를 할 :

def use(o:CheckedOption[String]) = { 
    o map { value => 
    value + "-Some" 
    } getOrElse "None" 
} 

val option1:Option[String] = Some(null) 
val option2:Option[String] = Some("foo") 

use(option1) //> res0: String = None 
use(option2) //> res1: String = foo-Some 
관련 문제