2009-01-03 29 views
24

Tôi đang làm việc với một bản đồ trong Scala và làm bình thường "nếu không có giá trị gắn liền với một chìa khóa, tạo ra nó, đặt nó trong bản đồ và gửi lại":Idiomatic Scala Bản đồ upsert

def alphaMemory(key : AlphaMemoryKey) = { 
    var am = map.getOrElse(key, null) 
    if(am == null) { 
     am = new AlphaMemory(key) 
     map.put(key, am) 
    } 
    am 
} 

Đối với tôi, điều này không giống như mã Scala thành ngữ. Nó giống như Java. Có cách viết ngắn gọn hơn không? Có vẻ như tôi có thể ghi đè lên Map.default() để chèn giá trị mới và trả lại nó. Không chắc chắn mặc dù.

Cảm ơn!

Trả lời

31

mutable.MapgetOrElseUpdate thực hiện chính xác những gì bạn muốn, không cần thành ngữ.

+0

Tuyệt vời! Tôi đã không nhận ra rằng tham số mặc định là "by-name" vì vậy tôi đã thuyết phục bản thân mình nó sẽ được đánh giá mỗi khi nó được gọi. Cảm ơn! –

+0

Tôi muốn quan tâm đến việc xem điều này sẽ được thực hiện với bản đồ bất biến như thế nào? –

+0

@Marcus Downing Hãy xem [câu hỏi này] (http://stackoverflow.com/q/4385976/460387) để biết các giải pháp cho 'immutable.Map' –

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