2014-11-25 79 views
15

我剛剛發現自己想要在java.util.Map中使用putIfAbsent(...)的版本,您可以提供某種工廠方法來實例化一個Object,如果它尚不存在。這會簡化很多代碼。爲什麼Java在Map中沒有putIfAbsent(key,supplier)方法?

這是我修改的接口:

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; 
    } 

} 

現在我的問題: 是否有這樣做的另一個(容易)的方式或有我只是忽略了Java API中的東西嗎?

+4

FWIW,['Map#putIfAbsent'](http://docs.oracle.com/javase/8/docs/api/java/util/Map.html#putIfAbsent-K-V-)被添加到Java8中。在Java 1.8中有 – fxm 2014-11-25 13:00:00

+0

有V putIfAbsent(K key,V value) – 2014-11-25 13:00:29

+0

我知道,但它只允許提供一個Object而不是一個Supplier方法。 – 2014-11-25 13:00:39

回答

17

是不是computeIfAbsent你想要什麼?

如果指定的鍵已經不再與值相關聯(或者是 映射爲空),嘗試使用給定的映射 函數來計算它的值,並且將其輸入本地圖除非空。

實現是一樣的東西:

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

所以它不是完全Supplier<V>簽名您已經發布,但接近。在映射函數中擁有關鍵參數是非常有意義的。

+0

啊。我忽略了那個。謝謝:) – 2014-11-25 13:01:58

+0

是的。作爲參數的關鍵更有意義,這是正確的。我會盡快接受這個答案。 – 2014-11-25 13:06:09

+0

適用於Java 7用戶的任何解決方案? – shlatchz 2016-11-15 16:37:49

相關問題