배열을 인라인으로 선언하는 방법이 있습니까?


617

문자열 배열을 인수로 취하는 메소드 m ()이 있다고 가정 해 봅시다. 전화를 걸 때이 배열을 인라인으로 선언 할 수있는 방법이 있습니까? 즉 :

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

이것을 한 줄로 바꾸고 절대 사용하지 않을 명명 된 변수를 선언하지 않아도됩니까?


2
리팩토링을 지원하는 IDE를 사용하면 str을 자동으로 인라인 할 수 있습니다.
폴 맥켄지

답변:


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

77
나중에 참조하기 위해이 유형의 배열을 익명 배열이라고합니다 (이름이 없으므로). "익명 배열 java"를 검색하면 일부 결과가 생성됩니다.
Falaina

2
캐스팅과 비슷합니다. 나는 그렇게 생각할 것이라고 생각합니다. 그래서 한 번 블루 문에서 구글을 할 필요가 없습니다.
ArtOfWarfare

이것은 코드 전용 답변이 완전히 수용 가능하고 실제로 더 선호되는 경우는 거의 없습니다.
최대 폰 히펠

113

Draemon이 맞습니다. varargsm 를 사용하는 것으로 선언 할 수도 있습니다 .

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
blefoot이 맞습니다. 그러나 당신은 할 수 있습니다void m(Integer i, Double d, String... str)
Igor S.

@MichaelMyers 의미는 무엇입니까(String ... strs)
Kasun Siyambalapitiya

1
@ KasunSiyambalapitiya : 내 답변의 링크를 클릭하십시오.
마이클 마이어스

30

결과를 List 인라인으로 사용하려면 다음과 같이 할 수 있습니다.

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

38
실제로 배열을 만들 필요가 없습니다. 간단히 수행 할 수 있습니다.Arrays.asList("string1", "string2", ...)
Elias Dorneles

2
아마도 유용한 점 : 프리미티브로는이 작업을 수행 할 수 없습니다. 그 기본 요소 Listtype[]있는 단일 요소 로 끝납니다 type. 예를 들면 Arrays.asList([some ints])A의 결과 List<int[]>.
Moira

@ 안토니오 카를로스 : 아닙니다. set반환 된 것을 호출 List하면 배열이 수정됩니다.
Holger

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 Answer

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

이미 a를 가지고 Collection배열을 인라인으로 변환하려면 다음을 사용하십시오.

collection.toTypedArray()

배열 유형을 강제해야하는 경우 다음을 사용하십시오.

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

그러나 당신은 할 수 없습니다 doSomething({"blah", "hey", "yo"}). 원래 질문에 대한 것이 었습니다.
David DeMar

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", ...});

이를 통해 메뉴 시스템을 설정하기위한 come 코드를 작성할 수 있습니다. "+"는 이전 항목 아래에 해당 항목을 배치하기에 충분합니다.

"menuFile, menuFileSave, menuFileLoad, ..."와 같은 메소드의 이름을 지정하고이를 반사적으로 바인딩하여 (다른 대안이 있음) 메소드 이름 지정 규칙으로 menuHandler 클래스에 바인딩 할 수 있습니다.

이 구문은 놀랍도록 간단한 메뉴 정의와 매우 재사용 가능한 "initMenus"메소드를 허용합니다. (그래서 작성하는 것이 항상 즐겁고 몇 분 + 몇 줄의 코드 만 필요하기 때문에 재사용하지 않아도됩니다).

코드에서 패턴을 볼 때마다 이와 같은 패턴으로 바꿀 수 있는지 확인하고 배열 초기화 구문이 얼마나 간결한 지 항상 기억하십시오.


5
이것은 varargs로 수행하는 것이 좋습니다. 또한 "재미"를 위해 코드를 입력하는 것을 좋아하는 사람은 누구나 공감할 가치가 있습니다! 코딩은 입력하지 않고 새로운 문제를 해결하는 것입니다. 아 잠깐, 이것은 자바입니다 ;-)
mjaggard

1
내가 썼을 때 varargs를 많이 사용하지 않았으며 varargs가 java에 존재하기 전에 배열 초기화를 약간 사용했습니다. 난 아직도위한 배열을 원합니다 한 부분은 당신이 ARAY로 정의하면 대신 인라인 데이터 파일의 상단에 그것을 일정을 만들 수 있습니다, 당신은 또한 설정 파일에 압축을 해제 할 수 있다는 것입니다
빌 K

그건 그렇고, 8 년 후 나는 초기화 된 문자열 배열을 사용하는 거의 모든 일을하기 위해 주석을 사용하고 있다고 말해야했습니다.
Bill K

2

다른 옵션은 org.apache.commons.lang3에서 ArrayUtils.toArray를 사용하는 것입니다

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

대안이지만 스택에 추가되는 추가 기능 호출이 필요하지 않습니다.
CybeX

1

Draemon이 말했듯이 Java가 인라인 배열에 가장 근접한 것은 new String[]{"blah", "hey", "yo"} 그러나 당신이 좋아하는 일을 할 수있는 깔끔한 트릭이있다

array("blah", "hey", "yo") 유형이 자동으로 추론됩니다.

인라인 배열 및 컬렉션 유형을 허용하도록 Java 언어를 향상시키는 유용한 API를 개발하고 있습니다. 자세한 내용은 Google 프로젝트 Espresso4J 또는 여기를 확인 하십시오.


9
여기에 몇 가지 문제가 있습니다. 1. 게시물과 프로필에서 Espresso4J와 관련이 있음을 명확하게 확인하십시오 (자주 묻는 질문 참조 ) 2. 상당히 오래된 게시물에 자신의 웹 사이트 링크를 신중하게 게시하십시오 ( 이것과 같은 특히 상투적 인 답변 이 한 ) - 매우 스팸으로 벗기하고 담당자 덴트 것이다 플래그를 발생시킵니다.
Kev

@Kev 아 죄송합니다. 내가 :) 지금은 잘 Espresso4J 프로젝트의 개발자를 해요 있음을 명확히 한
조나단 웨더
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.