스칼라 반복자 [옵션 [t]]를 반복자 [t]로 돌리는 스칼라
-
21-08-2019 - |
문제
나는있다 Iterator[Option[T]]
그리고 나는 얻고 싶다 Iterator[T]
그것들을 위해 Option
s 어디서 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에게 어려운 이름입니다 (실제로, 그것을 부릅니다. >>=
나에게 더 직관적 인 의미가있다).
제휴하지 않습니다 StackOverflow