にゃんきち(੭ˊ꒳​ˋ)੭✧

はっひゃー!借金返済がんばるば~ଘ(੭ˊ꒳​ˋ)੭✧

Java22新機能 無名変数にアンダースコアが使える

たまにはJavaを書こう

最近はプログラムを書いてなかったので、たまにはプログラム(Java)に触れてみようと思う。

いつの間にかJavaの最新バージョンは22になっている。ということでJava22の新機能を試していく~

新機能①:無名変数 (Unnamed Variables)にアンダースコア使えるよ

Javaには無名変数がある。これはその名の通り名前がなくてもよい変数である。

名前がなくてもよいという意味は、名前を付けたところでその後に名前を使わないので、名前を付けても意味がないということである。

例えば、以下のようなコードを書くことができる。このコードのfor (int a: orderIDs)のaというのが変数だが、for文の中でaを使わない。

したがって、名前を付けるだけ無駄である。無駄ではあるが、名前を付けないとコンパイルが通らないので名前を付けざるを得ない。めんどくさ~。ということでアンダースコアにすればいいよねってこと。

int[] orderIDs = {34, 45, 23, 27, 15};
int total = 0;
for (int a : orderIDs) {
    total++;
}
System.out.println("Total: " + total);

実行結果は以下の通り5である。このコードは配列の数を数えることなので、5であることは正しい結果である。

Total: 5

Java22で書き換えてみる

for (int a: orderIDs)aの部分を_に変更してみた。果たして動くのであろうか。

int[] orderIDs = {34, 45, 23, 27, 15};
int total = 0;
for (int _ : orderIDs) {
    total++;
}
System.out.println("Total: " + total);

実行結果は、Java21のほうと同じように、以下になり結果としては変わらない。

Total: 5

次にtoMap()の引数にアンダースコアを使用する

まずはjava21までのコード。このコードが意味するのは、"apple", "banana", "cherry"というList型をMap型のキーに使用する。キーにするときに小文字から大文字にする。Mapのバリューには"NO_DATA"を代入するという意味である。

List<String> inputList = List.of("apple", "banana", "cherry");

Map<String, String> resultMap = inputList.stream()
        .collect(Collectors.toMap(
                String::toUpperCase,
                k -> "NODATA"
        ));

resultMap.forEach((key, value) -> System.out.println(key + ": " + value));

実行結果は以下。

CHERRY: NODATA
APPLE: NODATA
BANANA: NODATA

ちなみに、このコードをかみ砕いたコードは以下になる。

List<String> inputList = List.of("apple", "banana", "cherry");

Map<String, String> resultMap = inputList.stream()
        .collect(Collectors.toMap(
                (k) -> {return k.toUpperCase();}, 
                (k) -> {return "NO_DATA");} 
        ));

resultMap.forEach((key, value) -> System.out.println(key + ": " + value));

toMap()は、以下のように引数はFunctionクラスを利用する。なのでラムダ式を利用し関数を定義している。

このコードをJava22にすると以下のようになる。kの部分を_にすることができる

List<String> inputList = List.of("apple", "banana", "cherry");

Map<String, String> resultMap = inputList.stream()
        .collect(Collectors.toMap(
                String::toUpperCase,
                _ -> "NO_DATA"
        ));

resultMap.forEach((key, value) -> System.out.println(key + ": " + value));

結論

無名変数を_で記載することが可能。

たまにはプログラムの最新の機能を触ってみるのも新鮮に感じる。