配列をインラインで宣言する方法はありますか?


617

文字列の配列を引数として取るメソッドm()があるとします。呼び出し時にこの配列をインラインで宣言する方法はありますか?つまり、代わりに:

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

これを1行に置き換えるだけで、使用しない名前付き変数を宣言しないようにできますか?


2
リファクタリングをサポートするIDEでは、strを自動的にインライン化できます。
ポールマッケンジー

回答:


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

77
後で参照するために、このタイプの配列は匿名配列と呼ばれます(名前がないため)。「匿名配列java」を検索すると、いくつかの結果が得られます。
Falaina、2009

2
それは鋳造に似ています。私はそれが私がそれを考える方法だと思うので、私はこれを行う必要があるブルームーンで一度それをググる必要はありません。
ArtOfWarfare 2012

これは、コードのみの回答が完全に受け入れられるまれな例であり、実際にはさらに望ましいかもしれません。
マックスフォンヒッペル

113

ドラえもんは正しいです。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
かなり良い構文ですが、この方法では配列パラメーターを1つしか持てず、最後のパラメーターでなければなりません。だから、あなたはできません:void m(String... strs, Integer... intgrs)例えば。
bluefoot 2011年

5
blefootは正しいです。しかし、あなたは行うことができますvoid m(Integer i, Double d, String... str)
イゴールS.

@MichaelMyersの意味は何ですか(String ... strs)
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya:回答のリンクをクリックしてください。
マイケル・マイヤーズ

30

別の方法として、結果をリストとしてインラインで表示したい場合は、次のように実行できます。

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

38
あなたが実際には配列を作成する必要はありません、あなたは簡単に行うことができます:Arrays.asList("string1", "string2", ...)
エリアスDorneles

2
おそらく有用な点:これはプリミティブでは実行できません。最終的には、そのプリミティブListtype[]どこにtypeあるかという単一の要素になります。たとえば、Arrays.asList([some ints])結果はになり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()

既にがありCollection、それをインラインの配列に変換したい場合は、次のように使用します。

collection.toTypedArray()

配列型を強制する必要がある場合は、以下を使用します。

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

しかし、あなたはできませんdoSomething({"blah", "hey", "yo"})。これは、元の質問が尋ねていたものです。
David DeMar 2018年

11

どこかにメソッドを作成できます

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

それを使う

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

よく見るために。


3

配列の初期化構文は非常に簡潔で柔軟であることを付け加えておきます。私は、コードからデータを抽出し、より使いやすい場所に配置するために、LOTを使用しています。

例として、私はしばしば次のようなメニューを作成しました:

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

これにより、メニューシステムをセットアップするためのコードを記述できます。「+」は、そのアイテムを前のアイテムの下に配置するように指示するのに十分です。

"menuFile、menuFileSave、menuFileLoad、..."のようなメソッドに名前を付け、反射的にバインドすることにより、メソッドの命名規則によってmenuHandlerクラスにバインドすることができます(他の方法があります)。

この構文により、驚くほど簡潔なメニュー定義と非常に再利用可能な「initMenus」メソッドが可能になります。(それでも、書くのはいつも楽しいし、数分+数行のコードしかかからないので、再利用する必要はありません)。

コードにパターンが見られるときはいつでも、このようなパターンに置き換えることができるかどうかを確認し、配列の初期化構文がいかに簡潔であるかを常に覚えておいてください。


5
これは、varargsとして行うことも推奨されます。また、「楽しい」ためにコードを入力するのが好きな人は誰でも反対票を投じる価値があります。コーディングとは、タイピングではなく、新しい問題を解決することです。ああ、これはJavaです;-)
mjaggard

1
あなたが正しい、私がこれを書いたとき、私は変数引数をあまり使用していませんでした-変数引数がJavaに存在する前に、配列初期化をかなり使用しました。私がまだ配列を好むのは、配列として定義する場合、インラインデータの代わりにファイルの先頭で定数にすることができ、それを構成ファイルに抽出できることです
Bill K

ちなみに、8年後は、初期化された文字列配列を使用するために使用していたほぼすべてのことを、注釈を使用して行うようになったと言わざるを得ません。
ビルK

2

その他のオプションは、org.apache.commons.lang3でArrayUtils.toArrayを使用することです

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

これは代替手段ですが、スタックに追加する必要のない追加の関数呼び出しがあります。
CybeX 2018

1

Draemonが言うように、Javaがインライン配列に最も近いのnew String[]{"blah", "hey", "yo"}は、次のようなことを可能にする巧妙なトリックです。

array("blah", "hey", "yo") タイプは自動的に推測されます。

インライン配列とコレクション型を可能にするJava言語を拡張するための便利なAPIに取り組んでいます。詳細については、GoogleプロジェクトEspresso4Jまたはこちらをご覧ください。


9
ここにいくつかの問題があります:1.投稿とプロフィールで、あなたがEspresso4Jに所属していることを十分に明確にしてください(FAQを参照してください)2.かなり古い投稿に自分のWebサイトへのリンクを注意深く投稿してください(特にこの定型文とこの定型文のような答え)-非常にスパム的であると見なされ、担当者を凹ませるフラグを立てます。
Kev

@ケフああごめんなさい。私は今、すばらしいEspresso4Jプロジェクトの開発者であることを明確にしました:)
ジョナサンウェザーヘッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.