나는 유사에 새 항목을 만들고 싶습니다 Util.Map.Entry
그 구조를 포함됩니다 key
, value
.
문제는 Map.Entry
인터페이스이기 때문에 인스턴스화 할 수 없다는 것입니다.
누구나 Map.Entry에 대한 새로운 일반 키 / 값 객체를 만드는 방법을 알고 있습니까?
답변
Map.Entry<K, V>
인터페이스를 직접 구현할 수 있습니다 .
import java.util.Map;
final class MyEntry<K, V> implements Map.Entry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
그런 다음 사용하십시오.
Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
답변
있습니다 public static class AbstractMap.SimpleEntry<K,V>
. 송출하지 마십시오 Abstract
는 사실이다 : 이름의 일부가 당신을 오해 하지abstract
클래스 (그러나 최상위AbstractMap
이다).
static
중첩 된 클래스 라는 사실은 인스턴스화를 위해 엔 클로징 인스턴스가 필요 하지AbstractMap
않으므로 다음과 같이 컴파일됩니다.
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
다른 답변에서 언급했듯이 구아바에는 편리한 static
공장 방법 Maps.immutableEntry
이 있습니다.
당신은 말했다 :
Map.Entry
분명히 인스턴스화 할 수없는 읽기 전용 객체이기 때문에 자체적으로 사용할 수 없습니다.instanceof
완전히 정확하지는 않습니다. 직접 인스턴스화 할 수없는 이유는 (예 🙂 new
때문 interface Map.Entry
입니다.
경고와 팁
설명서에서 언급했듯이 AbstractMap.SimpleEntry
is @since 1.6
이므로 5.0을 고수하면 사용할 수 없습니다.
알려진 다른 클래스를 찾으려면 implements Map.Entry
실제로 javadoc으로 직접 이동할 수 있습니다. 에서 자바 6 버전
인터페이스 Map.Entry
알려진 모든 구현 클래스 :
불행히도 1.5 버전 에는 사용할 수있는 알려진 구현 클래스가 나열되어 있지 않으므로 자신의 구현을 고수했을 수도 있습니다.
답변
Java 9 부터는 불변 항목을 작성할 수있는 새로운 유틸리티 메소드가 Map#entry(Object, Object)
있습니다.
다음은 간단한 예입니다.
Entry<String, String> entry = Map.entry("foo", "bar");
불변이므로 호출 setValue
하면가 발생합니다 UnsupportedOperationException
. 다른 제한 사항은 직렬화 할 수 없으며 null
키 또는 값이 금지되어 있기 때문에 허용되지 않는 경우 AbstractMap.SimpleImmutableEntry
또는 AbstractMap.SimpleEntry
대신 사용해야 합니다.
NB :Map
0에서 최대 10 (키, 값) 쌍으로 직접을 작성해야하는 경우 type 유형의 메소드를 대신 사용할 수 있습니다 Map.of(K key1, V value1, ...)
.
답변
구아바 에서 Maps.immutableEntry 를 사용해보십시오
이는 AbstractMap.SimpleEntry
Java 6이 필요하지 않은 Java 5와 호환되는 이점이 있습니다.
답변
AbstractMap.SimpleEntry의 예 :
import java.util.Map;
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
인스턴스화 :
ArrayList<Map.Entry<Integer, Integer>> arr =
new ArrayList<Map.Entry<Integer, Integer>>();
행 추가 :
arr.add(new AbstractMap.SimpleEntry(2, 3));
arr.add(new AbstractMap.SimpleEntry(20, 30));
arr.add(new AbstractMap.SimpleEntry(2, 4));
행 가져 오기 :
System.out.println(arr.get(0).getKey());
System.out.println(arr.get(0).getValue());
System.out.println(arr.get(1).getKey());
System.out.println(arr.get(1).getValue());
System.out.println(arr.get(2).getKey());
System.out.println(arr.get(2).getValue());
인쇄해야합니다 :
2
3
20
30
2
4
그래프 구조의 가장자리를 정의하는 데 좋습니다. 당신의 머리에있는 뉴런 사이의 것과 같습니다.
답변
실제로 다음을 수행 할 수 있습니다.
Map.Entry<String, String> en= Maps.immutableEntry(key, value);
답변
왜 Map.Entry
? 키-값 쌍과 같은 것이이 경우에 적합하다고 생각합니다.
사용 java.util.AbstractMap.SimpleImmutableEntry
또는java.util.AbstractMap.SimpleEntry