2015-09-15 17 views
5

Tôi có một Map[A, Option[B]], cách tối ưu để tạo phẳng là gì để có được một Map[A, B]?Làm phẳng Bản đồ Tùy chọn Bản đồ

Tôi biết để có danh sách chúng ta có thể sử dụng làm phẳng, nhưng cấu trúc này là khác nhau

Trả lời

13

Vâng, họ không giống nhau, do đó bạn sẽ cần một cách để xác định những gì sẽ xảy ra nếu một giá trị là None. Tôi giả sử bạn muốn bỏ qua những phím, nếu như vậy, bạn có thể thu thập với một chức năng một phần:

map.collect { 
    case (k, Some(v)) => k -> v 
} 

hoặc sử dụng một cho-hiểu

for ((k, Some(v)) <- map) yield k -> v 
+0

vâng tôi đã không chính xác rằng tôi không muốn chìa khóa với Không có giá trị, cảm ơn rất nhiều cho câu trả lời của bạn! – nam

+1

thực sự 'cho ((k, Một số (v)) <- bản đồ) năng suất k -> v' là đủ – dk14

+0

rất đúng! Tôi sẽ cập nhật! Mô hình đó có phù hợp ở trên và không bên dưới, idiot ... –

1

Nếu bạn không nhớ đúp lặp:

map.filter(_._2.nonEmpty).mapValues(_.get) 

Ví dụ:

scala> Map(1 -> Some(1), 2 -> None).filter(_._2.nonEmpty).mapValues(_.get) 
res9: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1) 

Hoặc sử dụng ngầm này:

implicit def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList 

Sau đó:

map.flatten.toMap 

Hoặc mà không sử dụng (không an toàn) ngầm:

map flatMap flat 

Ví dụ:

scala> Map(1 -> Some(1), 2 -> None).flatten.toMap 
res2: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1) 

scala> def flat[K,V](kv: (K, Option[V])) = kv._2.map(kv._1 -> _).toList 
warning: there was one feature warning; re-run with -feature for details 
flat: [K, V](kv: (K, Option[V]))List[(K, V)] 

scala> Map(1 -> Option(1), 2 -> None).flatMap(flat) 
res29: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1) 
+0

Đáng chú ý rằng 'mapValues' trả về một cái nhìn trên bản đồ, mà có lẽ không phải là những gì OP muốn. – jhn

+0

@jhn phụ thuộc, nếu mã bên trong mapValues ​​là tham chiếu trong suốt như trong câu trả lời của tôi, tại sao mọi người nên quan tâm? Đối với tuần tự hóa Java (nếu vẫn sử dụng nó vì một lý do nào đó), luôn có .view.force hoặc .map (identity) – dk14

+0

Tại sao mọi người nên quan tâm? Hiệu suất. – jhn

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