문제

나는있다 Iterator[Option[T]] 그리고 나는 얻고 싶다 Iterator[T] 그것들을 위해 Options 어디서 T isDefined. 이것보다 더 나은 방법이 있어야합니다.

it filter { _ isDefined} map { _ get }

나는 그것이 하나의 구성에서 가능하다고 생각했을 것입니다 ... 어떤 아이디어가 있습니까?

도움이 되었습니까?

해결책

경우 어디에 it 이다 Iterable

val it:Iterable[Option[T]] = ...
it.flatMap( x => x )                //returns an Iterable[T]

경우 어디에 it 이다 Iterator

val it:Iterator[Option[T]] = ...
it.flatMap( x => x elements )       //returns an Iterator[T]
it.flatMap( _ elements)             //equivalent

다른 팁

최신 버전에서는 다음과 같습니다.

val it: Iterator[Option[T]] = ...
val flatIt = it.flatten

이것은 나를 위해 작동합니다 (Scala 2.8) :

it.collect {case Some(s) => s}

나에게 이것은 Monadic UI의 고전적인 사용 사례입니다.

for {
  opt <- iterable
  t   <- opt
} yield t

그것은 단지 설탕입니다 flatMap 위에서 설명한 솔루션 및 동일한 바이트 코드를 생성합니다. 그러나 구문이 중요하며 Scala 's Monadic을 사용하기에 가장 좋은시기 중 하나라고 생각합니다. for 구문은 함께 일할 때입니다 Option, 특히 컬렉션과 함께.

이 제형은 특히 기능 프로그래밍에 익숙하지 않은 사람들에게는 상당히 더 읽기 쉬운 것으로 생각합니다. 나는 종종 루프의 모나 딕과 기능적 표현을 모두 시도하고 더 간단한 것처럼 보인다. 제 생각에는 플랫 맵 대부분의 사람들이 Grok에게 어려운 이름입니다 (실제로, 그것을 부릅니다. >>= 나에게 더 직관적 인 의미가있다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top