Eu gostaria de criar um novo item que de forma semelhante ao Util.Map.Entry
que conterá a estrutura key
, value
.
O problema é que não consigo instanciar um Map.Entry
porque é uma interface.
Alguém sabe como criar um novo objeto de chave / valor genérico para o Map.Entry?
java
dictionary
collections
key-value
Homem Aranha
fonte
fonte
Está aí
public static class AbstractMap.SimpleEntry<K,V>
. Não deixe que aAbstract
parte do nome o engane: na verdade, NÃO é umaabstract
classe (masAbstractMap
é de nível superior ).O fato de ser uma
static
classe aninhada significa que você NÃO precisa de umaAbstractMap
instância anexa para instancia-la, portanto, algo assim compila bem:Conforme observado em outra resposta, o Guava também possui um
static
método conveniente de fábricaMaps.immutableEntry
que você pode usar.Você disse:
Isso não é totalmente preciso. A razão pela qual você não pode instanciar diretamente (isto é, com
new
) é porque é uminterface Map.Entry
.Advertência e dica
Conforme observado na documentação,
AbstractMap.SimpleEntry
é@since 1.6
, portanto, se você estiver preso ao 5.0, ele não estará disponível para você.Para procurar outra classe conhecida que
implements Map.Entry
, na verdade, você pode ir diretamente para o javadoc. A partir da versão Java 6Infelizmente, a versão 1.5 não lista nenhuma classe de implementação conhecida que você possa usar; portanto, você pode ter dificuldades em implementar sua própria.
fonte
AbstractMap.SimpleEntry
não era público até o Java 6, como você pode ver na documentação.AbstractMap.SimpleEntry
. Eu acho que você aprende algo novo todos os dias!A partir do Java 9, existe um novo método utilitário que permite criar uma entrada imutável que é
Map#entry(Object, Object)
.Aqui está um exemplo simples:
Como é imutável, a chamada
setValue
lançará umUnsupportedOperationException
. As outras limitações são o fato de não ser serializável e,null
como a chave ou o valor é proibido, se não for aceitável para você, será necessário usarAbstractMap.SimpleImmutableEntry
ouAbstractMap.SimpleEntry
.Nota: se você precisar criar diretamente um
Map
com 0 a até 10 pares (chave, valor), você poderá usar os métodos do tipoMap.of(K key1, V value1, ...)
.fonte
Experimente Maps.immutableEntry de Guava
Isso tem a vantagem de ser compatível com o Java 5 (diferente do
AbstractMap.SimpleEntry
que requer o Java 6.)fonte
Exemplo de AbstractMap.SimpleEntry:
Instanciar:
Adicione linhas:
Buscar linhas:
Deve imprimir:
É bom para definir arestas de estruturas gráficas. Como aqueles entre neurônios em sua cabeça.
fonte
Você pode realmente ir com:
Map.Entry<String, String> en= Maps.immutableEntry(key, value);
fonte
Por quê
Map.Entry
? Eu acho que algo como um par de valores-chave é adequado para o caso.Use
java.util.AbstractMap.SimpleImmutableEntry
oujava.util.AbstractMap.SimpleEntry
fonte
org.apache.commons.lang3.tuple.Pair
implementajava.util.Map.Entry
e também pode ser usado de forma independente.Também como outros mencionaram a goiaba
com.google.common.collect.Maps.immutableEntry(K, V)
faz o truque.Eu prefiro
Pair
por suaPair.of(L, R)
sintaxe fluente .fonte
ImmutablePair
vez disso , posso sugerir ?Eu defini uma classe Pair genérica que eu uso o tempo todo. É ótimo. Como um bônus, definindo um método estático de fábrica (Pair.create), eu só tenho que escrever os argumentos de tipo pela metade com a mesma frequência.
fonte
Pair
implementações são ruins. FonteSe você estiver usando o Clojure, você tem outra opção:
fonte