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の機能は当面使用することはなさそうです。