2011-07-02 1 views
20

Giả sử tôi cóLàm cách nào để truy cập vào giá trị của bản đồ bằng khóa nếu khóa không được tìm thấy trong scala?

var mp = Map[String,String]() 

..... 

val n = mp("kk") 

trên sẽ ném lỗi thời gian chạy trong trường hợp chính "KK" không tồn tại.

Tôi dự kiến ​​n sẽ là null trong trường hợp khóa không tồn tại. Tôi muốn n là null nếu khóa không tồn tại.

Cách thích hợp để xử lý trường hợp này trong scala bằng mẫu mã ngắn là gì?

+7

Không bao giờ sử dụng 'null' trong scala. Các giá trị rỗng được "thay thế" bằng Tùy chọn. – paradigmatic

Trả lời

43

Trước hết, bạn có thể không thực sự muốn null, vì đó hầu như luôn là dấu hiệu của việc viết mã xấu trong Scala. Những gì bạn muốn cho n là loại Option [String], mà nói rằng giá trị là một String hoặc là mất tích. Đúng cách để làm điều đó là với phương pháp .get() trên bạn ánh xạ

val n = mp.get("kk") 

Nếu bạn thực sự cần null (cho interop với các thư viện Java, chẳng hạn), bạn có thể sử dụng .getOrElse()

val n = mp.getOrElse("kk", null) 
+14

mp.get ("kk"). OrNull :) –

17

Hãy thử điều này:

val valueOpt = mp.get("kk") 

Kết quả của bạn là loại Option[String] và có thể là None hoặc Some(actualValue). Bạn có thể sử dụng phù hợp với mô hình để tìm hiểu:

valueOpt match { 
    case Some(value) => println(value) 
    case None => println("default") 
} 

Một cách thích hợp hơn để làm điều đó loại của sự vật, tuy nhiên, là sử dụng các phương pháp trên Option, ví dụ:

println(valueOpt.getOrElse("default")) 

Look cho API tài liệu cho Optionthere.

Edit: Lưu ý rằng Map bản thân trực tiếp định nghĩa một phương pháp getOrElse cũng vậy, như thể hiện trong câu trả lời của Dave.