今更ながらJava12の新機能をまとめてみた

Posted on 2019/09/14

TOC

背景

今までJava8の案件が主だったのですが、最近Java12の案件にも参画させて頂いています。

ただ、開発している中でJava9以降の機能を使っておらず、使える機能がないかを調べる目的でまとめてみました。
今回使用するサンプルコードは以下に全て置いてあります。
https://github.com/somurieengieer/javaSelfTraining/blob/master/src/sample/java12newFunc/Java12sample.java

追加された機能

switch文の追加(プレビュー版)

switch文の新たな使い方が追加されました。右辺として使うことができるようになります。

具体的には以下の通りです。

System.out.println("-- アロー構文 --");
int num = 4;
switch(num) {
    case 1, 2, 3 -> System.out.println("複数条件を記述できます");
    case 4, 5, 6 -> {
System.out.println("複数行の処理を書くときには");
System.out.println("ブロックで書きます");
    }
    default -> System.out.println("条件に合致しない場合");
}

System.out.println("-- switch式 --");
String message = switch (num) {
    case 1, 2, 3 -> "複数条件を記述できます";
    case 4, 5, 6 -> {
System.out.println("ブロックの場合はbreakにより値を返却する");
break "ブロックによる記述もできます";
    }
    default -> "条件に合致しない場合";
};
System.out.println(message);

String

transform()の追加

今まで処理メソッドに対してStringの文字列を引数で渡していた処理に対して、transform()を使うとStringの文字列に対して処理を記述することができます。

具体例を見た方がわかりやすいので以下コードをご覧ください。
なお、transformメソッドの引数はFunction<? super String, ? extends R> f で、返り値はRです。

var userMap = Map.of("id111", "一太郎", "id222", "二太郎");

// キー、メソッド名の順に記載ができるます
System.out.println("id111".transform(userMap::get));

Collectors

teeing()の追加

メソッド定義は以下の通りです。第1第2引数であるCollectorによって処理した後、第3引数のmergerでマージします。

teeing​(Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)
以下例では簡単に最大値と最小値を文字列表記しています。teeingをネストすることで3つ以上のCollectorを使うこともできます。
正直なところ、うまい使い方が見つからないです。ネットでサンプルを探してみましたがteeingって素晴らしい、と思えるような書き方は発見できませんでした。

var intList = List.of(12,32,21,13);
// 値の範囲を文字列で出力する
String result =
intList.stream().collect(Collectors.teeing(
        Collectors.minBy(Integer::compareTo),
        Collectors.maxBy(Integer::compareTo),
        (min, max) -> min.get() + " ~ " + max.get()));
System.out.println(result);

所感

switchがわりと便利そうです。使ってみようと思ったのですがまだプレビュー版とのことでJava13でどうなるか気になりますね。

Java11がLTSなのでJava12の機能は当面使用することはなさそうです。