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メソッドが追加されており、簡単にテキストファイル内容の転送(コピーができる)
では今日はこの辺で!