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
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
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
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)
Đá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
@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
Tại sao mọi người nên quan tâm? Hiệu suất. – jhn
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
thực sự 'cho ((k, Một số (v)) <- bản đồ) năng suất k -> v' là đủ – dk14
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 ... –