2014-11-11 3 views
3

나는 종종 함께 체인에 Option 작업이 같을 다른 Option을 반환하는 함수를 가지고 찾는거야 : 패턴이

if(foo.isDefined) someFunctionReturningOption(foo.get) else None 

인가 거기 이것을하는 더 청결한 방법? 이 패턴은 좀 더 복잡한 변수로 매우 상세하게 나타납니다.

옵션 데이터를 처리해야하는 코드를 처리하는 데 공정한 비트가 있습니다. 값이 None 인 경우 None을 삽입하고 일부 값이있는 경우 일부 변형 (잠재적으로 실패 할 수 있음)을 삽입합니다.

이것은 매우 the ?. operator proposed for C#입니다.

답변

6

의 경우 가장 convinient입니다 거기 flatMap :

foo.flatMap(someFunctionReturningOption(_)) 

또는 for-comprehension :

for { 
    f <- foo 
    r <- someFunctionReturningOption(f) 
} yield r 

mul flatMap로 디 설탕을 치듯이 함께 여러 기능을 동시에 수행 할 수 있습니다.

2

당신은 flatMap 찾고 :이 유형을 포장 모나드 동일한 유형을 반환 flatMap를 사용하는 일반적인 모나드 구조에 맞는

foo.flatMap(someFunctionReturningOption) 

를 (예를 들어, Seq[T]flatMapSeq을 반환).

4

당신이 사용할 수있는 옵션 (말장난 의도)의하지만 함축에 대한 많은, 내 생각, 체인

for { 
    x <- xOpt 
    y <- someFunctionReturningOption(x) 
    z <- anotherFunctionReturningOption(y) 
} yield z 
2

Option지도()를 지원하므로 x이 구조 Option[Int] 때 :

if (x.isDefined) 
    "number %d".format(x.get) 
else 
    None 

뿐만 쓰기 쉽습니다 :

x map (i => "number %d".format(i)) 

지도가 수정되지 않은 None을 유지하지만,이 기능을 적용합니다 어떤 값으로 건네주고 결과를 다시 Option으로 래핑합니다. 예를 들어 'x'가 아래의 문자열 메시지로 변환되는 방법에 유의하십시오. 'y'는 None으로 전달됩니다.

scala> val x: Option[Int] = Some(3) 
x: Option[Int] = Some(3) 

scala> val y: Option[Int] = None 
y: Option[Int] = None 

scala> x map (i => "number %d".format(i)) 
res0: Option[String] = Some(number 3) 

scala> y map (i => "number %d".format(i)) 
res1: Option[String] = None