2013-01-31 51 views
10

Về cơ bản, tôi cần có một tập hợp các giá trị từ bản đồ cho một khóa trong một danh sách nhất định (trong cùng một khóa lệnh).Lấy các giá trị từ Bản đồ danh sách các phím trong Scala

val kv = Map("k3" -> "v3", "k1" -> "v1", "k2" -> "v2") 
val ks = List("k1", "k2") 

Điều tốt nhất tôi có thể ứng biến là foldRight qua ks:

scala> (ks foldRight List[String]()) { (v, a) => kv(v) :: a } 
res7: List[String] = List(v1, v2) 

Có cách nào thuận tiện hơn để làm điều này trong lib chuẩn hoặc chỉ mã ngắn hơn, tốt nhất là một cái gì đó giống nhau kv getVals ks? :)

Câu hỏi không quan trọng lắm, chỉ cần cố gắng khám phá theo phong cách tốt.

+0

Sẽ không phải là 'foldLeft' là một lựa chọn tốt hơn ở đây? Nó sẽ là một phong cách tốt hơn tôi nghĩ, bởi vì nó được thực hiện bởi iteration trong khi foldRight được thực hiện bởi đệ quy trong List.scala. –

+0

Câu trả lời dưới đây :) – dmitry

Trả lời

16

Sử dụng flatMap:

ks flatMap { k => kv get k } 

Hoặc tốt hơn:

ks flatMap (kv get) 

Và với for comprehensions:

for (k <- ks; v <- kv get k) yield v 

Nhưng không như cô đọng hoặc rõ ràng như của chính mình-liner của bạn : :-)

ks map kv 
List("k42") map kv // will barf 

Tuy nhiên, lưu ý rằng điều này là ngoại lệ - nó có thể ném một ngoại lệ nếu ks chứa khóa không được xác định trong bản đồ kv.

+3

Thần của tôi, nó hoạt động ngay cả như 'ks bản đồ kv', tôi rất mù :) – dmitry

+0

Vì bản đồ chính nó là một hàm ... – dmitry

18

Hoặc:

ks collect kv 

Kết quả là bao gồm tất cả các giá trị của kv mà một mấu chốt là ở ks.

(Bên cạnh đó là Bản đồ chức năng cũng là một phần chức năng)

+1

Tuyệt vời,' thu thập 'xảy ra là biến thể an toàn khi phím có thể bị thiếu. – dmitry

+1

+1 Tôi nghĩ rằng điều này là tốt như nó được. Làm thế nào mù là ** I ** để không khai thác 'Map' là một' PartialFunction'. – Faiz

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