2010-08-26 28 views
24

Có phương pháp API Scala nào để chuyển đổi Seq[Option[T]] -> Seq[T] không?Scala có phương pháp API chuyển đổi Seq [Option [T]] thành Seq [T] không?

Bạn có thể làm điều này bằng tay thông qua:

seq.filter(_.isDefined).map(_.get) 

Tự hỏi nếu có một phương pháp mà không được nêu trên trong API chung.

+1

'filter' +' map' có thể được giảm xuống thành 'collect' có chức năng một phần làm tham số. – tiran

Trả lời

41

Tuyệt đối, không tích cực. (Không!)

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

scala> so1.flatten 
res0: List[Int] = List(1, 2, 3) 
+0

không? (15 ký tự) –

+2

Đáng ngạc nhiên so1.flapMap (r => r) cũng hoạt động. Điều này có vẻ là do thực tế là Option có thể được chuyển đổi thành một iterable thông qua: implicit def option2Iterable [A] (xo: Option [A]): ​​Iterable [A] = xo.toList. Khi xo.toList được gọi chỉ một số (X) tạo ra một giá trị danh sách. Không có gì cho một List(). Flatmap làm phần còn lại. – ssanj

+9

Không đáng ngạc nhiên, bởi vì 'flatMap (fun) '==' map (fun) .flatten'. – Debilski

Các vấn đề liên quan