목록에서 없음을 필터링하는 방법 [옵션]?


105

나는이있는 경우 List[Option[A]]스칼라에서 필터링 할 수있는 관용적 인 방법은 무엇입니까 None값은?

한 가지 방법은 다음을 사용하는 것입니다.

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)

더 "특이한"방법이 있습니까? 이것은 매우 간단 해 보입니다.


답변:


161

동시에 옵션을 제거하려면 flatten다음을 사용할 수 있습니다 .

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)

23
나는이 추가 것 flatMap이외의 다른 목록 요소를 처리하는 데 사용할 수있는 None유사들, someList.flatten.map하나는 종종 단지 이러한 요소와 작업하고 싶어하지로, flatten재미 중 목록을.
프랭크

예, Raph에게 필터링 된 목록으로 무엇을하려고하는지 물어보고 싶었습니다. 그러나 단순히 평면화하려는 시나리오도 많이 있습니다.
Nicolas

때로는 Option객체 의 내용을 검색하고 싶지만 다른 경우에는 Option[A]. 나는 점점 더 많은 용도를 찾고 있습니다 Option[A]-멋진 기능.
Ralph

동등한 flatForeach 유형 메소드가 있습니까?
cdmckay

1
컬렉션이 변경 불가능한 경우 faltmap이 트릭을 수행합니다. 컬렉션이 변경 가능한 경우 아니요, 없습니다.
Nicolas


2

cats또한 갖는다 라이브러리 flattenOption온 모든 F[Option[A]]으로 F[A](여기서 F[_]A는 FunctorFilter)

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.