2016-02-09 22 views
5

Tôi đang phát triển một số mã bằng cách sử dụng Scala và tôi đang cố gắng giải quyết một cách thông minh một phép chuyển đổi cơ bản giữa các bộ sưu tập có chứa một số Option[T].Thông minh đối phó với Tùy chọn [T] trong Scala

Hãy nói rằng chúng tôi có danh sách sau đây

val list: List[(A, Option[B])] = // Initialization stuff 

và chúng tôi muốn áp dụng một chuyển đổi để list để có được danh sách sau đây

val transformed: List[(B, A)] 

cho tất cả Option[B] s mà đánh giá để Some[B]. Cách tốt nhất tôi tìm thấy để làm điều này là áp dụng chuỗi chuyển đổi sau đây:

val transformed = 
    list.filter(_.isDefined) 
     .map { case (a, Some(b)) => (b, a) } 

Tuy nhiên tôi cảm thấy rằng tôi đang thiếu điều gì đó. Cách tốt nhất để xử lý Option[T] là gì?

Trả lời

13

Bạn có thể sử dụng collect:

val transformed = list.collect { 
    case (a, Some(b)) => (b, a) 
} 

Thu thập, theo quy định tại các tài liệu:

Xây dựng một bộ sưu tập mới bằng cách áp dụng một hàm từng phần cho tất cả các yếu tố của danh sách này mà trên đó các chức năng là được xác định.

Có nghĩa là, nó chỉ mang lại kết quả cho các yếu tố khớp với bất kỳ trường hợp nào được xác định trong chức năng một phần của bạn. Tôi thích nghĩ về nó như một kết hợp filtermap.

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