Как использовать литералы коллекции в Java 7?

Я пробовал следующую строку:

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

Но Netbeans 7 отклоняет это сообщение с сообщением об ошибке '{' expected, ';' expected.

Я установил исходный/двоичный формат как "JDK 7", а платформа "JDK 1.7", есть ли что-нибудь еще, что мне нужно сделать?

Ответ 1

Java 7 не поддерживает литералы коллекции. Они запланированы для Java 8. Они не сделали это даже в Java 8, как обсуждалось в этом вопросе: Улучшения коллекции Project Coin будут в JDK8?

Вы можете использовать Google Guava, если вам нужны только неизменные коллекции. ImmutableList, ImmutableSet и ImmutableMap имеют несколько перегруженных методов factory или даже сборщиков, которые упрощают создание коллекций:

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");

ИЗМЕНИТЬ

Java 9, вероятно, добавит набор методов factory, аналогичный тем, которые существуют в Guava:

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)
);

Ответ 2

Вам необходимо определить конкретную реализацию карты, необязательно в сочетании с инициализацией двойной скобки:

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

Ответ 3

Чтобы немного рассказать о Томасе, ответьте... Карта является интерфейсом и должна быть создана через одну из связанных конкретных реализаций (HashMap, TreeMap или LinkedHashMap). Это по-прежнему хорошая практика; однако, объявить вашу ссылочную переменную как реализацию интерфейса, а не конкретную конкретную, поскольку она обеспечивает будущую гибкость.

Что касается фрагмента кода, тем не менее, я думаю, что вам все еще нужны пары Key-value, определенные на стороне присваивания декларации. Итак, я бы изменил:

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

к

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