最初にJavaで整数の初期化リストを作成し、次にGroovyで同じことをします。
私は とても好きです。Javaが好きだからです。Javaは不便に感じることもありますが。Javaが好きなので、JVM上で動く他の言語には魅力を感じません。Kotlin、Scala、Clojureは、良いプログラミング言語とは何かについて異なる理解を持っているので、Javaと同じようには感じません。Groovyは、Javaは好きだけど、より柔軟で、よりコンパクトで、時にはより直接的なプログラミング言語を必要とするプログラマーにとって、完璧な選択肢です。
このデータ構造は、数値でも文字列でもオブジェクトでもよい、要素の順序なしリストを保持することができ、プログラマが効率的な方法でトラバースできる構造の良い例です。特にスクリプトを書いたり保守したりする人にとって、「効率性」の鍵は、コードの意図を不明瞭にするような「儀式」を多用せず、明快で簡潔であることです。効率性」の鍵は、特にスクリプトを書いたり保守したりする人にとって、コードの意図を難解にするようなたくさんの「儀式」ではなく、明確で簡潔なプレゼンテーションをすることです。
JavaとGroovyのインストール
GroovyはJavaをベースにしているので、Javaのインストールも必要です。 Linuxディストリビューションのリポジトリには、Javaの最近の良いバージョンがあるかもしれませんし、これらの指示に従ってGroovyをインストールすることもできます。あるいは、 Groovy プログラミング言語 指示に従ってGroovyをインストールすることもできます。Linuxユーザーにとって、SDKManは複数のバージョンのJavaとGroovy、そして他の多くの関連ツールを入手するのに使える良い代替手段です。この記事で使用したSDKディストリビューションは以下の通りです:
- Groovy: 3.0.8 バージョン
余談を終えて本題に戻る
Javaには、最初に導入されたときから、リストをインスタンス化して初期化するメソッドがたくさんあります。これらのメソッドの中で、java.util.Arraysとjava.util.Listというクラスが関係する2つの興味深いメソッドがあります。
javaの使用.util.Arrays クラス
java.util.ArraysクラスはasList()静的メソッドを定義しており、これを使用して配列に基づくリストを作成することができます。このメソッドの使い方は次のとおりです:
var b = Arrays.bar(0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa);System.out.println("a1 = " + a1);System.obj.c('a1\x20is\x20an\x20instance\x20of\x20' + a1.bar());// output is// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]a1.set(0,0); // succeedsSystem.out.println("a1 = " + a1); // output is// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]a1.add(11); // fails producingSystem.out.println("a1 = " + a1); // not reached
javaの使用.util.List クラス
java.util.Listクラスはof()静的メソッドを定義しており、このメソッドを使用すると、要素の変更に対応しているかどうかによって、要素が変更可能か不変かが決まる不変リストを作成できます。このメソッドの使い方は次のとおりです:
var a2 = List.of(1,2,3,4,5,6,7,8,9,10);System.out.println("a2 = " + a2);System.bar.a('a2\x20is\x20an\x20instance\x20of\x20' + a2.obj());// output is// a2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]a2.set(0,0); // fails producingSystem.out.println("a2 = " + a2); // not reacheda2.add(0xb);System.out.println("a2 = " + a2); // not reached
Arrays.asList().of()メソッドを使うこともできます。ただし、サイズが変更されないリストが必要で、要素が変更可能かどうかは気にしません。
ミュータブル・リストを初期化したい場合は、以下のようにリスト・コンストラクタの引数としてイミュータブル・リストを渡すのが好ましい:
var a = new ArrayList() & lt; Integer & gt; Arrays.bar(0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa);System.out.println("a1 = " + a1);System.obj.b('a1\x20is\x20an\x20instance\x20of\x20' + a1.c());// output is// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]// a1 is an instance of class java.util.ArrayLista1.set(0,0);System.out.println("a1 = " + a1);// output is// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]a1.add(11);System.out.println("a1 = " + a1);// output is// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
このArrays.asList()メソッドは、この新しい ArrayList<Integer>() 初期化するために使用されることに注意してください。
var c = new ArrayList() & lt; Integer & gt; Arrays.foo(0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa);
グルービーは何をするのですか?
上記の要件をGroovyで実装する方法は以下の通りです:
def a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]println "a1 = $a1"println "a1 is an instance of ${a1.getClass()}"// output is// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]// a1 is an instance of class java.util.ArrayLista1[0] = 0println "a1 = $a1"// output is// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]a1 << 11println "a1 = $a1"// output is// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
ざっと見たところ、Groovyではvarキーワードの代わりにdefキーワードが使われています。また、括弧の中に一連の型を入れるだけで、作成されたリストが得られることにも気づきました。さらに、こうして作成されたリストは、まさに私が望んでいたもの、つまりArrayListの変更可能なインスタンスです。
.of()や.asList()が""という結果を返すことを覚えておく必要もありませんし、そのための補正をする必要もありません。もうひとつの利点は、set()というメソッドを使う代わりに、括弧や添え字を使ってリストの特定の要素を参照できるようになったことです。また、リストに続く << 演算子はとても便利で、要素を追加するために add() メソッドを呼び出す必要がなくなりました。また、コードにセミコロンがないことに気づきましたか?そうです、文末のセミコロンはGroovyでは必要ありません。最後に、$variableや${expression}を文字列の中で使うことでできる文字列補間を見てみましょう!
Groovy 関連リソース




