Любой способ объявить массив в строке?


617

Допустим, у меня есть метод m (), который принимает массив строк в качестве аргумента. Есть ли способ, которым я могу просто объявить этот массив в строке, когда я делаю вызов? т.е. вместо:

String[] strs = {"blah", "hey", "yo"};
m(strs);

Могу ли я просто заменить это одной строкой и избежать объявления именованной переменной, которую я никогда не собираюсь использовать?


2
Среда IDE, поддерживающая рефакторинг, позволит вам автоматически подключать strs.
Пол Маккензи

Ответы:


945
m(new String[]{"blah", "hey", "yo"});

77
Просто для дальнейшего использования, этот тип массива известен как анонимный массив (так как у него нет имени). поиск "Анонимный массив Java" дал бы некоторые результаты.
Фалаина

2
Это похоже на кастинг. Я думаю, что именно так я и буду думать об этом, поэтому мне не нужно гуглить один раз в синий месяц, мне нужно это сделать.
ArtOfWarfare

Это редкий случай, когда ответ только на код является полностью приемлемым, а на самом деле, может быть, даже предпочтительным.
Макс фон Хиппель

113

Демон правильный. Вы также можете объявить, mчто принимаете varargs :

void m(String... strs) {
    // strs is seen as a normal String[] inside the method
}

m("blah", "hey", "yo"); // no [] or {} needed; each string is a separate arg here

19
довольно хороший синтаксис, но с этим методом вы можете иметь только один параметр массива, и он должен быть последним. Таким образом, вы не можете сделать, void m(String... strs, Integer... intgrs)например.
Bluefoot

5
блеф это правильно. Но вы можете сделатьvoid m(Integer i, Double d, String... str)
Игорь Сергеевич

@MichaelMyers В чем смысл(String ... strs)
Касун Сиямбалапития

1
@KasunSiyambalapitiya: нажмите на ссылку в моем ответе.
Майкл Майерс

30

Другой способ сделать это, если вы хотите, чтобы результат был встроен в List, вы можете сделать это следующим образом:

Arrays.asList(new String[] { "String1", "string2" });

38
на самом деле вам не нужно создавать массив, вы можете сделать это просто:Arrays.asList("string1", "string2", ...)
Элиас Дорнелес

2
Возможно полезный момент: вы не можете сделать это с примитивами. Вы будете в конечном итоге с одноэлементных Listиз type[]которых typeявляется то , что примитивно. например, Arrays.asList([some ints])приводит к List<int[]>.
Мойра

@ Антонио Карлос: нет, это не так. Вы можете вызвать setвозвращенный объект, Listи он изменит массив.
Хольгер

17

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

String[] array = {"blah", "hey", "yo"};

или

int[] array = {1, 2, 3};

Если вам нужно встроить, вам нужно объявить тип:

functionCall(new String[]{"blah", "hey", "yo"});

или используйте varargs (переменные аргументы)

void functionCall(String...stringArray) {
    // Becomes a String[] containing any number of items or empty
}

functionCall("blah", "hey", "yo");

Надеемся, что разработчики Java разрешат неявную инициализацию в будущем

Обновление: Kotlin Ответ

Kotlin сделал работу с массивами намного проще! Для большинства типов просто используйте, arrayOfи он будет неявно определять тип. Не пропустите ничего, чтобы оставить их пустыми.

arrayOf("1", "2", "3") // String
arrayOf(1, 2, 3)       // Int
arrayOf(1, 2, "foo")   // Any 
arrayOf<Int>(1, 2, 3)  // Set explict type
arrayOf<String>()      // Empty String array

Примитивы имеют функции полезности. Не пропустите ничего, чтобы оставить их пустыми.

intArrayOf(1, 2, 3)
charArrayOf()
booleanArrayOf()
longArrayOf()
shortArrayOf()
byteArrayOf()

Если у вас уже есть Collectionи вы хотите преобразовать его в массив, просто используйте:

collection.toTypedArray()

Если вам нужно привести тип массива, используйте:

array.toIntArray()
array.toLongArray()
array.toCharArray()
...

Но вы не можете сделать то doSomething({"blah", "hey", "yo"}), о чем спрашивал оригинальный вопрос.
Дэвид ДеМар

11

Вы можете создать метод где-нибудь

public static <T> T[] toArray(T... ts) {
    return ts;
}

тогда используй это

m(toArray("blah", "hey", "yo"));

для лучшего взгляда.


3

Я хотел бы добавить, что синтаксис инициализации массива очень лаконичен и гибок. Я использую это много, чтобы извлечь данные из моего кода и разместить его где-то более удобным для использования.

Например, я часто создавал такие меню:

Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});

Это позволило бы мне написать код для настройки системы меню. «+» Достаточно, чтобы сказать ему, чтобы поместить этот элемент под предыдущим элементом.

Я мог бы связать его с классом menuHandler либо по соглашению об именах методов, назвав мои методы чем-то вроде «menuFile, menuFileSave, menuFileLoad, ...» и связав их рефлексивно (есть и другие альтернативы).

Этот синтаксис позволяет ИЗУМИТЕЛЬНО короткое определение меню и чрезвычайно многократно используемый метод initMenus. (Тем не менее, я не беспокоюсь о том, чтобы использовать его повторно, потому что писать это всегда весело и занимает всего несколько минут + несколько строк кода).

всякий раз, когда вы видите шаблон в своем коде, посмотрите, можете ли вы заменить его чем-то вроде этого, и всегда помните, насколько лаконичен синтаксис инициализации массива !.


5
Это также было бы предпочтительнее сделать как varargs. Кроме того, любой, кто любит набирать код для «веселья», заслуживает снижения! Кодирование - это решение новых проблем, а не печать. Ой, подождите, это Java ;-)
mjaggard

1
Вы правы, когда я писал это, я мало использовал varargs - и я использовал инициализацию массива еще до того, как varargs существовал в java. Одна часть, для которой я все еще предпочитаю массивы, заключается в том, что если вы определите его как массив, вы можете сделать его константой в верхней части файла вместо встроенных данных, а также вы можете извлечь его в файл конфигурации
Bill K

Кстати, 8 лет спустя я должен был сказать, что теперь я использую аннотации для выполнения почти всех вещей, для которых я использовал инициализированные массивы строк.
Билл К

2

Другой вариант - использовать ArrayUtils.toArray в org.apache.commons.lang3.

ArrayUtils.toArray("elem1","elem2")

Это альтернатива, однако она имеет дополнительные функциональные вызовы, добавляющие в стек, которые не нужны.
CybeX

1

Как говорит Draemon, Java ближе всего подходит для встроенных массивов, new String[]{"blah", "hey", "yo"}однако есть хитрый трюк, который позволяет вам делать что-то вроде

array("blah", "hey", "yo") с типом, автоматически выведенным.

Я работал над полезным API для расширения языка Java, чтобы учесть встроенные массивы и типы коллекций. Для более подробной информации о проекте Google Espresso4J или проверить его здесь


9
Просто пара вопросов здесь: 1. Пожалуйста, убедитесь, что в своих постах и ​​профиле вы четко даете понять, что вы связаны с Espresso4J (см. Наш FAQ ) 2. Пожалуйста, будьте осторожны при размещении ссылок на свой собственный сайт на довольно старых постах ( особенно шаблонные ответы, такие как этот и этот ) - это звучит как очень спам и поднимает флаги, которые испортят вашу репутацию.
Кев

@Kev ах прости. Я уточнил, что я сейчас являюсь разработчиком прекрасного проекта Espresso4J :)
Джонатан Уэтерхед,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.