文字列の配列を引数として取るメソッドm()があるとします。呼び出し時にこの配列をインラインで宣言する方法はありますか?つまり、代わりに:
String[] strs = {"blah", "hey", "yo"};
m(strs);
これを1行に置き換えるだけで、使用しない名前付き変数を宣言しないようにできますか?
文字列の配列を引数として取るメソッドm()があるとします。呼び出し時にこの配列をインラインで宣言する方法はありますか?つまり、代わりに:
String[] strs = {"blah", "hey", "yo"};
m(strs);
これを1行に置き換えるだけで、使用しない名前付き変数を宣言しないようにできますか?
回答:
m(new String[]{"blah", "hey", "yo"});
ドラえもんは正しいです。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
void m(String... strs, Integer... intgrs)
例えば。
void m(Integer i, Double d, String... str)
(String ... strs)
別の方法として、結果をリストとしてインラインで表示したい場合は、次のように実行できます。
Arrays.asList(new String[] { "String1", "string2" });
Arrays.asList("string1", "string2", ...)
List
がtype[]
どこにtype
あるかという単一の要素になります。たとえば、Arrays.asList([some ints])
結果はになりList<int[]>
ます。
set
返されたを呼び出すList
と、配列が変更されます。
初期化子なしで、配列を最新の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により、配列の操作が非常に簡単になりました。ほとんどのタイプでは、単に使用する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"})
。これは、元の質問が尋ねていたものです。
配列の初期化構文は非常に簡潔で柔軟であることを付け加えておきます。私は、コードからデータを抽出し、より使いやすい場所に配置するために、LOTを使用しています。
例として、私はしばしば次のようなメニューを作成しました:
Menu menu=initMenus(menuHandler, new String[]{"File", "+Save", "+Load", "Edit", "+Copy", ...});
これにより、メニューシステムをセットアップするためのコードを記述できます。「+」は、そのアイテムを前のアイテムの下に配置するように指示するのに十分です。
"menuFile、menuFileSave、menuFileLoad、..."のようなメソッドに名前を付け、反射的にバインドすることにより、メソッドの命名規則によってmenuHandlerクラスにバインドすることができます(他の方法があります)。
この構文により、驚くほど簡潔なメニュー定義と非常に再利用可能な「initMenus」メソッドが可能になります。(それでも、書くのはいつも楽しいし、数分+数行のコードしかかからないので、再利用する必要はありません)。
コードにパターンが見られるときはいつでも、このようなパターンに置き換えることができるかどうかを確認し、配列の初期化構文がいかに簡潔であるかを常に覚えておいてください。
その他のオプションは、org.apache.commons.lang3でArrayUtils.toArrayを使用することです
ArrayUtils.toArray("elem1","elem2")
Draemonが言うように、Javaがインライン配列に最も近いのnew String[]{"blah", "hey", "yo"}
は、次のようなことを可能にする巧妙なトリックです。
array("blah", "hey", "yo")
タイプは自動的に推測されます。
インライン配列とコレクション型を可能にするJava言語を拡張するための便利なAPIに取り組んでいます。詳細については、GoogleプロジェクトEspresso4Jまたはこちらをご覧ください。