Pergunta sobre collections, java – Como uso literais de coleção no Java 7?

19

Eu tentei a seguinte linha:

Map<Character, Color> map={new Character('r'):Color.red,new Character('b'):Color.black};

Mas o Netbeans 7 rejeita isso, com a mensagem de erro'{' expected, ';' expected.

Eu configurei o formato Source / Binary como 'JDK 7' e a plataforma como 'JDK 1.7', há mais alguma coisa que eu precise fazer?

No Java 8, você pode usar esse truque para obter literais de mapas razoáveis ​​a partir de expressões lambda:gist.github.com/galdosd/10823529 Domingo Ignacio
Os dois pontos parecem engraçados! :) user unknown
Esse truque depende do compilador em uso. Eu acho que funciona com o Eclipse, mas não com o javac. Stuart Marks

Sua resposta

3   a resposta
0

e deve ser instanciado através de uma das implementações concretas associadas (HashMap, TreeMap ou LinkedHashMap). Ainda é uma boa prática; no entanto, declarar sua variável de referência como a implementação da interface em vez do concreto específico, pois ela fornece flexibilidade futura.

Em relação ao snippet de código, acho que você ainda precisa dos pares de valor-chave definidos no lado da atribuição da declaração. Então, eu mudaria:

Map<Character, Color> map = new HashMap<>() {{ 

para

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
@lmsurprenant você não pode usar <> com classes internas anônimas Jonas Alves
Não, o operador <> foi adicionado no Java 1.7 como açúcar sintático, portanto, você não precisa ser tão detalhado. lmsurprenant
11

Você precisa definir uma implementação de mapa concreto, opcionalmente combinada com a inicialização de chave dupla:

Map<Character, Color> map = new HashMap<Character, Color>() {{ 
  put(new Character('r'), Color.red);
  put(new Character('b'), Color.black );
}};
@Natix Sim, a inicialização com chave dupla não é realmente recomendada. Acabei de mencioná-la como uma resposta à pergunta do OP. É verdade que existem alternativas muito melhores para conseguir isso. Além disso, criando umCharacter manualmente (boxe manual) ou usando autoboxing não é realmente uma razão para uma downrate. É uma questão de estilo e tentei usar o máximo possível do código do OP para manter a confusão baixa. Thomas
Eu gosto deste. Eu vi um constructo semelhante em outros lugares ultimamente, mas algumas pessoas sugeriram nunca usar subclasses anônimas para escrever literais. Discordo. GhostCat
Eu pessoalmente não votei em você, mas vejo dois problemas com o seu código. Primeiro, criar uma subclasse anônima apenas para inicialização não é uma prática muito boa. Vejostackoverflow.com/a/924536/581205 Em segundo lugar, você não precisa criar manualmente uma nova ocorrência de caractere, o autoboxing faz isso para você:put('r', Color.red); Natix
Hmm, se alguém classificar um post abaixo, seria bom receber algum feedback do porquê. Estamos todos aqui para aprender, não estamos? Thomas
Deve usar valueOf em todas as classes nativas, no entanto. stolsvik
48

Nem o Java 7 nem o Java 8 suportam literais de coleção, como discutido nesta questão:Os aprimoramentos da coleção do Project Coin serão no JDK8?

Você pode usar o GoogleGoiaba biblioteca se você precisar apenas de coleções imutáveis.ImmutableList, ImmutableSet eImmutableMap tem vários métodos de fábrica sobrecarregados ou mesmo construtores que facilitam a criação de coleções:

List<Integer> list = ImmutableList.of(1, 1, 2, 3, 5, 8, 13, 21);
Set<String> set = ImmutableSet.of("foo", "bar", "baz", "batman");
Map<Integer, String> map = ImmutableMap.of(1, "one", 2, "two", 3, "three");

EDITAR

Java 9 adicionoumétodos de fábrica de coleta semelhante aos da goiaba:

List.of(a, b, c);
Set.of(d, e, f, g);
Map.of(k1, v1, k2, v2)

Map.ofEntries(
    entry(k1, v1),
    entry(k2, v2),
    entry(k3, v3),
    // ...
    entry(kn, vn)
);
Eu deveria ter pesquisado. É uma pena, na verdade; Eu estava ansioso para usar literais de coleção. Obrigado! DaedalusUsedPerl

Perguntas relacionadas