HashMap
세트에서 찾을 수없는 모든 키에 대해 기본값을 반환 할 수 있습니까?
답변
[최신 정보]
다른 답변과 의견 작성자가 언급했듯이 Java 8부터 간단히 전화 할 수 있습니다 Map#getOrDefault(...)
.
[실물]
이 작업을 정확히 수행하는 Map 구현은 없지만 HashMap을 확장하여 직접 구현하는 것은 쉽지 않습니다.
public class DefaultHashMap<K,V> extends HashMap<K,V> {
protected V defaultValue;
public DefaultHashMap(V defaultValue) {
this.defaultValue = defaultValue;
}
@Override
public V get(Object k) {
return containsKey(k) ? super.get(k) : defaultValue;
}
}
답변
Java 8에서는 Map.getOrDefault를 사용 하십시오 . 일치하는 키가 없으면 키를 반환하고 값을 반환합니다.
답변
바퀴를 재발견하고 싶지 않다면 Commons의 DefaultedMap을 사용하십시오 .
Map<String, String> map = new DefaultedMap<>("[NO ENTRY FOUND]");
String surname = map.get("Surname");
// surname == "[NO ENTRY FOUND]"
처음에지도 작성을 담당하지 않는 경우 기존지도를 전달할 수도 있습니다.
답변
Java 8 은 게으른 계산 값을 저장하고 맵 계약을 위반하지 않는 인터페이스에 멋진 computeIfAbsent 기본 메소드를 도입했습니다 Map
.
Map<Key, Graph> map = new HashMap<>();
map.computeIfAbsent(aKey, key -> createExpensiveGraph(key));
출처 : http://blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/
Disclamer :
이 답변은 OP가 요청한 것과 정확히 일치하지 않지만 키 번호가 제한되어 있고 다른 값의 캐싱이 수익성이있는 경우 질문 제목과 일치하는 경우에 유용 할 수 있습니다. 메모리가 불필요하게 낭비되므로 키가 많고 기본값이 같은 반대의 경우에는 사용하면 안됩니다.
답변
정확히 이것을 수행하는 정적 메소드를 작성할 수 없습니까?
private static <K, V> V getOrDefault(Map<K,V> map, K key, V defaultValue) {
return map.containsKey(key) ? map.get(key) : defaultValue;
}
답변
HashMap을 상속하는 새 클래스를 작성하고 getDefault 메소드를 추가하기 만하면됩니다. 다음은 샘플 코드입니다.
public class DefaultHashMap<K,V> extends HashMap<K,V> {
public V getDefault(K key, V defaultValue) {
if (containsKey(key)) {
return get(key);
}
return defaultValue;
}
}
Ed Staub가 언급 한 이유와 Map 인터페이스 계약 을 위반하기 때문에 구현에서 get (K key) 메소드를 재정의해서는 안된다고 생각합니다 (이는 잠재적으로 찾기 어려운 결과를 초래할 수 있음) 버그).
답변
사용하다:
myHashMap.getOrDefault(key, defaultValue);
