2014-11-25 31 views
15

Tôi vừa mới tìm thấy bản thân mình muốn có một phiên bản putIfAbsent (...) trong java.util.Map mà bạn có thể cung cấp một số loại phương pháp nhà máy, để khởi tạo một đối tượng nếu nó chưa có. Điều này sẽ đơn giản hóa rất nhiều mã.Tại sao Java không có phương thức putIfAbsent (khóa, nhà cung cấp) trong Bản đồ?

Đây là giao diện chỉnh sửa của tôi:

import java.util.Map; 
import java.util.function.Supplier; 

/** 
* Extension of the Map Interface for a different approach on having putIfAbsent 
* 
* @author Martin Braun 
*/ 
public interface SupplierMap<K, V> extends Map<K, V> { 

    public default V putIfAbsent(K key, Supplier<V> supplier) { 
     V value = this.get(key); 
     if(value == null) { 
      this.put(key, value = supplier.get()); 
     } 
     return value; 
    } 

} 

Bây giờ câu hỏi của tôi: Có khác (dễ dàng hơn) cách để làm điều này hoặc đã tôi chỉ bỏ qua một cái gì đó trong API Java?

+4

FWIW, ['Bản đồ # putIfAbsent'] (http://docs.oracle.com/javase/8/docs/api/java/util/Map.html#putIfAbsent-K-V-) được thêm vào với Java8. – fxm

+0

trong Java 1.8 có V putIfAbsent (khóa K, giá trị V) –

+0

Tôi biết, nhưng nó chỉ cho phép cung cấp một đối tượng thay vì một phương pháp nhà cung cấp. –

Trả lời

17

Không phải là computeIfAbsent bạn muốn gì?

Nếu khóa chỉ định không được kết hợp với một giá trị (hoặc là ánh xạ null), cố gắng để tính toán giá trị của nó bằng cách sử dụng cho lập bản đồ chức năng và nhập số đó vào bản đồ này trừ khi null.

thực hiện là một cái gì đó như:

if (map.get(key) == null) { 
    V newValue = mappingFunction.apply(key); 
    if (newValue != null) { 
     map.put(key, newValue); 
    } 
} 

Vì vậy, nó không hoàn toàn Supplier<V> chữ ký bạn đã đăng nhưng gần đó. Có khóa là đối số trong hàm ánh xạ chắc chắn có ý nghĩa.

+0

Ah. Tôi đã bỏ qua điều đó. Cảm ơn :) –

+0

Đúng. Chìa khóa làm đối số có ý nghĩa hơn, đúng vậy. Tôi sẽ chấp nhận câu trả lời này càng sớm càng tốt. –

+0

Bất kỳ giải pháp nào cho người dùng Java 7? – shlatchz

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