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

Posted by user on Friday, August 23, 2019

TOC

背景

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

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

追加された機能

var型の追加

新しい型としてvar型が追加されました。型推論という機能を使って、コンパイル時に右辺の値から型を決定することができます。

略式記述(シンタックスシュガー)です。

var list = new ArrayList<String>(); // listはArrayList<String>型になる
list.add("aaa");
list.add("bbb");
list.stream().forEach(System.out::println);
// ローカル変数にのみ使用可能。インスタンス変数は不可
// ラムダ引数には使えないので注意

var i = 10;
var s = "aiueo";
// プリミティブ型にも使える

List

copyOfメソッドの追加

Listを複製する。複製したListは修正不可(追加・削除不可)だが、各要素が参照しているオブジェクト内は修正可能であるため注意。

class Person {
    String name;
    int age;
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
};
var list = new ArrayList<Person>();
list.add(new Person("personA", 1));
var list2 = List.copyOf(list);
list2.stream().forEach(System.out::println);

// コピー元のListが参照している先のオブジェクトを変更するとコピー元も変更される
list.get(0).age = 100;
System.out.println("-- 年齢変更後のコピー元");
list.stream().forEach(p -> System.out.println(p.name + ", " + p.age));
System.out.println("-- 年齢変更後のコピー先");
list2.stream().forEach(p -> System.out.println(p.name + ", " + p.age));

// コピー先は追加削除は不可。addするとエラー
// list2.add(new Person("errorPerson", 2));

// コピー元にはもちろんaddはできる
list.add(new Person("personB", 2));
System.out.println("-- 追加した後のコピー元");
list.stream().forEach(p -> System.out.println(p.name + ", " + p.age));

// コピー先の値は変更されない
System.out.println("-- 追加した後のコピー先");
list2.stream().forEach(p -> System.out.println(p.name + ", " + p.age));

Optional

orElseThrow()の追加

Optionalの値が存在すれば値を返し、nullの場合には例外をスローします。

デフォルトではNoSuchElementExceptionを返却し、引数にExceptionを設定することにより変更することも可能です。

Optional<String> opt1 = Optional.ofNullable("hoge");
System.out.println(opt1.orElseThrow());

try {
    Optional<String> opt2 = Optional.ofNullable(null);
    System.out.println(opt2.orElseThrow());
} catch (Exception e) {
    System.out.println("exception class: " + e.getClass());
    System.out.println("nullのためthrowされる");
}

所感

今回ピックアップする項目が少なかったです。半年毎のリリースになるとさすがに少なくなりますね。

varについてはまずは単体テスト等で積極的に使っていきたいと思います。List.copyOfはJava9に続いてイミュータブル化推進されている感じがしますね。