Будь-який спосіб оголосити масив в рядку?


617

Скажімо, у мене є метод m (), який приймає масив Strings як аргумент. Чи є спосіб я просто оголосити цей масив в рядку під час здійснення дзвінка? тобто замість:

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

Чи можу я просто замінити це одним рядком і уникати оголошення названої змінної, яку я ніколи не буду використовувати?


2
IDE, який підтримує рефакторинг, дозволить вам автоматично вводити рядки.
Пол Маккензі

Відповіді:


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

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

2
Це нагадує кастинг. Я думаю, що так я подумаю про це, тому мені не доведеться гуляти його раз у блюмоні, мені це потрібно зробити.
ArtOfWarfare

Це рідкісний випадок, коли відповідь, що стосується лише коду, є цілком прийнятною, а насправді, можливо, навіть кращою.
Макс фон Гіппель

113

Draemon правильний. Ви також можете оголосити m, що приймає вараги :

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)наприклад.
блакитноногий

5
блефут прав. Але можна зробитиvoid m(Integer i, Double d, String... str)
Ігор С.

@MichaelMyers Який сенс(String ... strs)
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya: Клацніть посилання у моїй відповіді.
Майкл Майерс

30

Ще один спосіб зробити це, якщо ви хочете, щоб результат був у списку вбудованим, можна зробити так:

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

38
вам фактично не потрібно створювати масив, ви можете просто:Arrays.asList("string1", "string2", ...)
Еліас Дорнелес

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

@Antonio Carlos: ні, це не так. Ви можете зателефонувати 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 дозволять неявну ініціалізацію в майбутньому

Оновлення: Відповідь Котліна

Котлін значно спростив роботу з масивами ! Для більшості типів просто використовуйте, 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
Це також було б краще робити як вараги. Крім того, кожен, хто любить вводити код для "забави", заслуговує на голосування! Кодування - це вирішення нових проблем, а не введення тексту. О, зачекайте, це Java ;-)
mjaggard

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

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

2

Іншим варіантом є використання ArrayUtils.toArray в org.apache.commons.lang3

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

Це альтернатива, однак вона має додаткові функціональні дзвінки, додаючи до стеку непотрібні.
CybeX

1

Як каже Дреймон, найближче, що Java приходить до вбудованих масивів, new String[]{"blah", "hey", "yo"}однак є акуратний трюк, який дозволяє зробити щось на кшталт

array("blah", "hey", "yo") з типом автоматично робиться висновок.

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


9
Тут є лише декілька питань: 1. Будь ласка, переконайтеся, що у своїх публікаціях та профілі ви чітко вказуєте, що ви пов’язані з Espresso4J (будь ласка, дивіться наші FAQ ) 2. Будьте уважні, розміщуючи посилання на свій власний веб-сайт на досить старих публікаціях ( особливо відповіді на котлоагреганті, як ця та ця ) - вона виходить дуже спам і піднімає прапори, які дозволять залишити ваш представник.
Кев

@Kev ах вибачте. Я уточнив, що зараз розробник прекрасного проекту Espresso4J :)
Jonathan Weatherhead,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.