Ответ 1
http://blog.firdau.si/2010/07/01/java-tips-initializing-collection/
List<String> s = Arrays.asList("1", "2");
Я ищу компактный синтаксис для создания экземпляра коллекции и добавления нескольких элементов к ней. В настоящее время я использую этот синтаксис:
Collection<String> collection =
new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" }));
Мне кажется, что существует более компактный способ сделать это, который использует анонимный подкласс ArrayList
, а затем добавляет элементы в конструкторе подкласса. Тем не менее, я не могу вспомнить точный синтаксис.
http://blog.firdau.si/2010/07/01/java-tips-initializing-collection/
List<String> s = Arrays.asList("1", "2");
Думаю, вы думаете о
collection = new ArrayList<String>() { // anonymous subclass
{ // anonymous initializer
add("1");
add("2");
add("3");
}
}
который, скомпонованный, дает
collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}
ЧУВСТВИТЕЛЬНО, мягко говоря. Однако существует вариант метода Arrays.asList: Arrays.asList(T...a)
, который обеспечивает компромисс и читаемость. В качестве примера он дает следующую строку кода:
collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter
И обратите внимание, что вы не создаете анонимный подкласс ArrayList для сомнительного использования.
Возможно, это был
Collection<String> collection = new ArrayList<String>() {{
add("foo");
add("bar");
}};
Также известен как инициализация с двойной скобкой.
Вы можете создать служебную функцию:
@SafeVarargs
public static <T> List<T> listOf(T ... values) {
return new ArrayList<T>(Arrays.asList(values));
}
Итак, вы можете называть его так:
collection = MyUtils.listOf("1", "2", "3");
Таким образом, вы можете легко заполнить список и по-прежнему не изменять его.
Возможно, это только я, но я не вижу смысла усложнять вещи, просто в поисках более короткого/быстрого кода. Учитывая выбор печатать меньше строк кода и намного легче отлаживать/пересматривать, я уверен, что я выберу второй вариант.
Таким образом, если нет конкретной причины настаивать на том, чтобы сохранить это короткое, я бы сказал, что придерживаюсь бритвы Оккама, и, учитывая ряд решений проблемы, переходите к самому простому. Таким образом, когда что-то пойдет не так (что закон Мерфи явно диктует его), вам будет намного легче отслеживать его.:)