2014-11-25 6 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; 
    } 

} 

이제 내 질문 : 이 일의 또 다른 (쉬운) 방법이 있나요 아니면 그냥 자바 API에서 뭔가를 간과?

+4

FWIW, ['Map # putIfAbsent'] (http://docs.oracle.com/javase/8/docs/api/java/util/Map.html#putIfAbsent-K-V-)가 Java8과 함께 추가되었습니다. – fxm

+0

Java 1.8에서 V putIfAbsent (K 키, V 값) –

+0

알지만, Supplier 메소드 대신 Object를 제공 할 수 있습니다. –

답변

17

computeIfAbsent은 원하는 것이 아닙니까? 지정된 키가 이미 값과 관련된 (또는 NULL에 매핑 이다)되지 않으면

는 주어진 맵핑 함수를 사용하여 값을 계산하기 위해 시도하고 널 않는 맵으로 들어간다.

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

그래서 정확히 Supplier<V> 당신이 게시 한 서명 만에 가까운 아니다 :

구현 같은입니다. 매핑 함수에서 key를 인자로 가지는 것은 확실히 의미가 있습니다.

+0

아. 나는 그것을 간과했다. 고마워요 :) –

+0

예프. 인수로서의 열쇠는 더 의미가 있습니다. 나는 가능한 한 빨리이 대답을 받아 들일 것이다. –

+0

Java 7 사용자를위한 솔루션? – shlatchz