システムエンジニア兼IT講師の備忘録

技術やトレーニングテクニックなどを思いのままに発信していきます。

JDK10で実装されたAPI2つ

こんにちは!

今日はJDK10で追加されたAPIを2つ程ご紹介します。
追加されたAPIの一覧はこちらをどうぞ。

コレクションのImmutableなコピー

JDK10からは、Immutable(addやput等の変更ができない)Listを作るためのAPIが追加されました。 これによって、一時的なコレクションのビューを返したい時など、変更されては困るコレクションが作成しやすくなっています。
この機能は従来からも一応存在してはいましたが、コードが冗長であるなど少々問題を抱えていました。
※作成済みのListのImmutableなコピーを作成する(従来の方法)

//リスト作成
List<Integer> list = new ArrayList<>();

//適当に要素追加
list.add(1);
list.add(2);
list.add(3);

//Immutableなコピーの作成
Collections <Integer> tmpView = Collections.unmodifiableCollection(list);

//tmpViewはImmutableになっているため変更不可(UnsupportedOperationExceptionがスローされる)
tmpView.add(4);

//元のlistはImmutable化していないので変更可能
list.add(4);

さて、JDK10での新しいAPIです。 java.util.List、java.util.Set、java.util.Mapの各インタフェースに、新しく「copyOf」メソッドが追加されており、
これを利用することでImmutableなコピーの取得が可能です。

//リスト作成
List<Integer> list = new ArrayList<>();

//適当に要素追加
list.add(1);
list.add(2);
list.add(3);

//Immutableなコピーの作成
var tmpView = List.copyOf(list);

//tmpViewはImmutableになっているため変更不可(UnsupportedOperationExceptionがスローされる)
tmpView.add(4);

という感じです。 少しは直感的になったのではないでしょうか。

ファイルのコピー

FileReaderやFileWriterを使ってファイルをコピーする際、
ファイルの中身を一文字(Buffered系の場合は一行)単位で読み取っては対象ファイルに書き出すか、
Files等を使用して冗長なコードを書くしかありませんでした。

現時点ではテキストデータに限られるようですが、FileReaderクラスにtransferToメソッドが追加されており、
簡単にファイル内容の転送が行えます。

コードはこんな感じです。
※jshell環境で動作確認しているため、本来は例外処理が必要になると思われます。

//コピー元のファイルを指定
FileReader reader = new FileReader("sample.txt");

//コピー先のファイルを指定
FileWriter writer = new FileWriter("transfer.txt");

//FileReaderのtransferToメソッドを呼び出し、引数にFileWriterオブジェクトを渡す
reader.transferTo(writer);

//各ファイルのフラッシュまたはクローズ
reader.close();
writer.close();

だいぶスッキリしたと思います。

まとめ

・List、Set、Mapの各コレクションにcopyOfメソッドが追加されており、Immutableなコレクションのコピーが取得できる
・FileReaderクラスにtransferToメソッドが追加されており、簡単にテキストファイル内容の転送(コピーができる)

では今日はこの辺で!