2013-05-22 18 views
7

Tôi có một bộ sưu tập là Option[T] và bây giờ tôi muốn trích xuất các giá trị từ nó. Nhưng tôi cũng muốn bộ sưu tập mới loại trừ None s.Chuyển đổi Seq [Tùy chọn [T]] thành Seq [T]

val foo = List(None, None, Some(1), None, Some(2)) 

Ý tưởng đầu tiên đến với tâm trí của tôi là map, nhưng có một chút không trực quan.

foo.map(o => o.get) // Exception! 
foo.map(o => o.getOrElse(null)).filterNot(_ == null) // List(1, 2), works but not elegant 

Có cách nào đơn giản hơn để đạt được hành vi này không?

+6

flatMap that shit :) –

Trả lời

22

Sử dụng flatten phương pháp:

scala> val foo = List(None, None, Some(1), None, Some(2)) 
foo: List[Option[Int]] = List(None, None, Some(1), None, Some(2)) 

scala> foo.flatten 
res0: List[Int] = List(1, 2) 

Chỉ cần được hoàn thành, đó cũng là flatMap phương pháp:

foo.flatMap(x => x) 

và cho-hiểu:

scala> for(optX <- foo; x <- optX) yield x 
res1: List[Int] = List(1, 2) 

và thu thập (hành vi như bộ lọc + bản đồ):

scala> foo.collect { case Some(x) => x } 
res2: List[Int] = List(1, 2)