Java SE8 Gold (2)

Java SE 8 Gold 研修 2 日目のメモ.
ここから難度が微妙に上がる….
NIO2が難しい….後日ブラッシュアップ更新します….

ラムダ式続き

Stream API

過去記事参照

ジェネリクスとコレクション

ジェネリクス

  • コードに対する柔軟な型の安全性の提供
  • 実行時に発生する多くの一般的なエラーをコンパイル時に確認可能
  • 整理された記述しやすいコードの提供
  • コレクションでのキャストの必要性が低くなる
  • Java Collections API で頻繁に使用される
任意の識別子(慣例)
  • T : 型
  • E : 要素
  • K : キー
  • V : 値
  • S, U : 2 つ目,3 つ目またはそれ以降の型に使用
型推論ダイアモンドが使用されたジェネリクス

型推論ダイアモンドは JDK 7 の新機能

List<T> list = new ArrayList<>();

コレクション

オブジェクトのグループを管理するために設計されたシングルオブジェクト
コレクションにプリミティブ型を含めることはできない
様々なコレクション型により,多くの一般的なデータ構造が実装(Stack, Queue, 動的配列, Hash)

自動ボクシング及びアンボクシング

プリミティブ型とその Wrapper クラス(ex. int ⇄ Integer)を移動する時,
自動ボクシング及びアンボクシングが行われており,
正式なキャスト構文を使用されずに適切な割り当てを行うことができる.
但し,その分内部で処理が発生するためオーバーヘッドが生じることに注意.

コレクション型

List≪interface≫

重複可能.順序付けられている.

Set≪interface≫

重複不可.順序付けられていない.

  • TreeSet : 内部ではソートされている.
Map≪interface≫

複数のキー/値のペアを保存する.連想配列

  • TreeMap : キーが自動的にソートされる
  • HashMap : null キー及び null 値を受け入れる.同期されない.

Queue

FIFO

  • Deque : double ended queue(両端キュー)の略.Queue の拡張
    キュー(FIFO)やスタック(FILO)のような動作を実現できる interface
    FIFO の場合:add()や offer(),remove()や poll(),element()など FILO の場合:push(),pop(),peek()

実装はArrayDequeクラスやLinkedListクラスがある.

Comparable≪interface≫ と Comparator≪interface≫

Comparable

インスタンスの前後関係の判定のためにそのクラス自身に実装

Comparable の compareTo メソッド : int compareTo(T parameter)
ソート順が自インスタンスが前,parameter が後になる場合:
  compareTo メソッドでの値を返すように実装
ソート順が parameter が前,自インスタンスが後になる場合:
  compareTo メソッドでの値を返すように実装

String の compareTo メソッド : int (StringObj s1).compareTo(String s2)
ソート順として,s1 が前に,s2 が後になる場合:の値を返す
ソート順として,s2 が前に,s1 が後になる場合:の値を返す
ソート順として,s1 が s2 が同じ場合:0 を返す

Comparator

インスタンスをソートするためのロジックを構成するクラスで実装

Comparator の compare メソッド : int compare(T p1, T p2)
ソート順が p1 が前,p2 が後になる場合:
  compare メソッドでの値を返すように実装
ソート順が p2 が前,p1 が後になる場合:
  compare メソッドでの値を返すように実装

例外

例外処理

例外発生時にtry-catch文を使用して制御を例外処理ブロックに移すこと

例外宣言

throws句をメソッドの宣言に追加し,
メソッドを特定の方法で実行できない可能性があることを示す.
別のユーザが対処する必要がある.

throw 文

例外を発生させる文(例外オブジェクトを新規に生成する)

throws 句

メソッド定義に付加する句

例外ロギング

printStackTrace()

スタック・トレース

getMessage()

例外メッセージの取得

チェック例外と非チェック例外

チェック例外
  • 特定の Java コードにおいて,発生し得ることがコンパイル段階でチェックされる例外
  • try-catch 句や throws 句の記述が必須
  • IOException, FileNotFoundException, SQLException
非チェック例外
  • 特定の Java コードにおいて,発生し得ることがコンパイル段階でチェックされない例外
  • try-catch 句や throws 句の記述が必須ではない
  • NumberFormatException,ArrayIndexOutOfBoundsExceptionなど
java.lang.Throwable クラス

finally 句

try ブロック実行中でエラーが発生したかどうか関係なく,常に実行される.
ファイルや DB 接続などのリソースを開いていて,
それらが必要なくなったら常にクローズする必要がある時によく使われる

try-with-resources 句

Java SE 7 から導入.

  • 1 つ以上のリソースを宣言する try 文
  • java.lang.AutoCloseable を実装する全てのクラスをリソースして使用可能
    ファイル IO 系(NIO),DB アクセス系(JDBC)など
  • 冗長な finally ブロックが不要になる
try(InputStream in = new FileInputStream("missingFile.txt")){
    System.out.println("File Open");
    int data = in.read();
} catch (FileNotFoundException e){
    System.out.println(e.getMessage());
} catch (IOException e){
    System.out.println(e.getMessage());
}

multi-catch 句

Java SE 7 から導入

  • 単一の catch ブロックで 1 つ以上の型を例外処理できる
try(InputStream in = new FileInputStream("missingFile.txt")){
    System.out.println("File Open");
    int data = in.read();
    // 複数の例外型は縦線で区切る
} catch (ClassNotFoundException | IOException e){
    System.out.println(e.getMessage());
}
  • 縦線で区切られている例外型は継承関係にない必要がある.
    つまり,FileNotFoundException と IOException の両方は指定できない

Java I/O (基本)

I/O ストリーム

ファイルの読取及び書込,キーボード(標準入力)とコンソール(標準出力)など
の出力デバイスに対する情報の読取及びを行う.

java.io.FileInputStream
java.io.FileOutputStream
java.io.DataInputStream
java.io.DataOutputStream

バイト・ストリームの InputStream メソッド

read()
close()

開いているストリームを閉じる

available()

使用できるバイト数

skip()

ストリームから n バイト破棄

バイト・ストリームの OutputStream メソッド

write()
close()

try-with-resources で自動的に閉じられる

flash()

ストリームへの書込みを強制

キャラクター・ストリームの Reader メソッド

read()
close()
ready()
skip()
markSupported()
mark()
reset()

キャラクター・ストリームの Writer メソッド

write()
close()
flash()

I/O ストリームの連鎖

入力ストリームの連鎖
出力ストリームの連鎖

リアライゼーション(直列化)

  • シリアライズ : JVM ヒープ・メモリ内にあるオブジェクトを
    ディスクなど外部に出力する(永続化)ためのフォーマット変換
  • java.io.Serializable インタフェースを実装しているクラスのオブジェクトはシリアライズ可能
  • transient修飾子を指定すればシリアライズ対象にならない

Java ファイル I/O (NIO.2)

Java SE 7 から導入
java.nio.file.Pathオブジェクトのインスタンスを使用して
ファイルまたはディレクトリの相対的または絶対的位置を表す.

パスは絶対パスあるいは相対パスを指定する.

NIO2 はラムダ式と Stream API と組み合わせて IO 処理を楽にしている

java.nio.file.Path

システム依存パスを使用して,ファイルまたはディレクトリを検索する

java.nio.file.Files(ファイル操作)

ファイルおよびディレクトリに対する操作を実行する

確認

exists()
notExists()

作成

createFile()
createDirectory()

削除

delete()

コピー

copy(sourcePath, targetPath, CopyOption...)

REPLACE_EXISTING
COPY_ATTRIBUTES
NOFOLLOW_LINKS

移動

move(sourccePath, targetPath, CopyOption...)

ディレクトリの内容の一覧表示

Files.list()
戻り値はStream 型であることに注意

ディレクトリ構造の探索

Files.walk()
戻り値はStream 型であることに注意

BufferedReader ファイル・ストリーム

lines()
BufferedReader をストリームに変換する

NIO ファイル・ストリーム

lines()

ArrayList へのファイル読込

readAllLines()
ファイルを ArrayList にロードする.