Компактный синтаксис для создания инициализирующей коллекции - PullRequest
20 голосов
/ 22 сентября 2010

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

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" }));

Кажется, я помню, что есть более компактный способ сделать это, используя анонимный подкласс ArrayList, затем добавить элементы в конструктор подкласса. Однако я не могу вспомнить точный синтаксис.

Ответы [ 6 ]

28 голосов
/ 22 сентября 2010
8 голосов
/ 22 сентября 2010

Полагаю, вы думаете о

collection = new ArrayList<String>() { // anonymous subclass
     { // anonymous initializer
         add("1");
         add("2");
         add("3");
     }
}

, который, если сопоставить, дает

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}

FUGLY, если не сказать больше.Тем не менее, существует вариант метода Arrays.asList: Arrays.asList(T...a), который обеспечивает сопоставимость и удобочитаемость.Например, он дает следующую строку кода:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter

И обратите внимание, что вы не создаете анонимный подкласс ArrayList сомнительного использования.

2 голосов
/ 22 сентября 2010

Может быть, это было

Collection<String> collection = new ArrayList<String>() {{
    add("foo");
    add("bar");
}};

Также известен как инициализация в двойных скобках.

1 голос
/ 05 июля 2016

Вы можете создать служебную функцию:

@SafeVarargs
public static <T> List<T> listOf(T ... values) {
    return new ArrayList<T>(Arrays.asList(values));
}

Так что вы можете назвать это как:

collection = MyUtils.listOf("1", "2", "3");

Таким образом, вы можете очень легко заполнять список и сохранять его изменчивым.

0 голосов
/ 22 сентября 2010

Может быть, это только я, но я не вижу смысла усложнять вещи, просто в стремлении написать более короткий / быстрый код.Учитывая возможность набирать наименьшее количество строк кода и гораздо более легкую отладку / пересмотр, я почти уверен, что выбрал бы второй вариант.

Таким образом, если нет особой причины настаивать на том, чтобы держать это коротким, я бы сказал, придерживайтесь бритвы Оккама, и, учитывая ряд решений проблемы, используйте самый простой.Таким образом, когда что-то пойдет не так (что четко определено законом Мерфи), вам будет намного легче отследить это.:)

0 голосов
/ 22 сентября 2010
...