contents memorandum はてな

目次とメモを置いとく場

『Javaによる関数型プログラミング―― Java 8ラムダ式とStream』(Venkat Subramaniam[著] プログラミングシステム社[訳] オライリージャパン 2014//2014)

原書:Functional Programming in Java
著者:Venkat Subramaniam
寄稿:Brian Goetz  Java Language Architect
訳者:株式会社プログラミングシステム社
レビュア:櫻庭 祐一[さくらば・ゆういち] 
レビュア:中島 克之[なかじま・かつゆき] 
レビュア:薬科 卓[わらしな・すぐる] 
NDC:007.64 情報科学
NDC:549.87 


O'Reilly Japan - Javaによる関数型プログラミング


【目次】
日本語版まえがき(櫻庭祐一 Java Champion) [v-vi]
まえがき(Brian Goetz 2013年9月) [vii]
はじめに [ix-xv]
  誰が本書を読むべきか
  本書の内容
  本書で使用するJavaのバージョン
  サンプルコードの読み方
  オンラインリソース
  意見と質問
  謝辞
目次 [xvii-xx]


1章 Hello、ラムダ式! 001
  1.1 考え方を変える
    1.1.1 従来の方法
    1.1.2 より良い方法
    1.1.3 具体的な改善ポイント
    1.1.4 シンプルな場合を越えて
    1.1.5 もう一度、従来の方法
    1.1.6 もう一度、より良い方法
    1.1.7 改善ポイント
    1.1.8 ラムダ式が救う
  1.2 関数型のコードによる大きな利益

  1.3 なぜ関数型で記述するのか
    1.3.1 強化されたイテレータ
    1.3.2 ポリシーの強制
    1.3.3 ポリシーの拡張
    1.3.4 混乱のないコンカレンシー[Concurrency]
    1.3.5 物語を語る
    1.3.6 関心の分離
    1.3.7 評価を遅らせる
    1.3.8 テスト環境の向上
  1.4 革命ではなく、進化
    1.4.1 宣言的になる
    1.4.2 不変性の尊重
    1.4.3 副作用を避ける
    1.4.4 文より式を優先
    1.4.5 高級階数を使って設計する
  1.5 簡単にするためのほんの少しの砂糖
  1.6 まとめ


2章 コレクションの使用 023
  2.1 リストをイテレート
  2.2 リストの変換
    2.2.1 ラムダ式を使う
    2.2.2 メソッド参照を利用
  2.3 要素の検索
  2.4 ラムダ式の再利用
  2.5 静的スコープとクロージャ
    2.5.1 ラムダ式における重複
    2.5.2 静的スコープで重複排除
    2.5.3 スコープを限定するようにリファクタリング
  2.6 要素を 1つ選択
  2.7 コレクションを単一の値に集約(reduce)
  2.8 要素の結合
  2.9 まとめ


3章 文字列、コンパレータ、フィルタ 051
  3.1 文字列のイテレーション
  3.2 Comparatorインタフェースを実装
    3.2.1 コンパレータを使ったソート
    3.2.2 コンパレータの再利用
  3.3 複数のプロパティによる流暢な比較
  3.4 collectメソッドとCollectorsクラスの使用
  3.5 ディレクトリの全ファイルをリスト
  3.6 ディレクトリの特定のファイルだけをリスト
  3.7 flatMapで直下のサブディレクトリをリスト
  3.8 ファイルの変更を監視
  3.9 まとめ


4章 ラムダ式で設計する 079
  4.1 ラムダ式を使った関心の分離
    4.1.1 デザイン問題の探究
    4.1.2 問題でがんじがらめ
    4.1.3 主要な関心を分離
  4.2 ラムダ式を使った委譲
    4.2.1 委譲の生成
    4.2.2 Webサービススタブの実装
    4.2.3 Webサービスとの統合
  4.3 ラムダ式を使ったデコレーション
    4.3.1 フィルタをデザイン
    4.3.2 フィルタを追加
    4.3.3 複数のフィルタを追加
  4.4 defaultメソッドを覗く
  4.5 ラムダ式を使った流暢なインタフェース
    4.5.1 設計開始
    4.5.2 メソッドチェーンの使用
    4.5.3 APIを直感的かつ流暢にする
  4.6 例外処理
  4.7 まとめ


5章 外部リソースを扱う 109
  5.1 リソースの解放
    5.1.1 問題を覗いてみる
    5.1.2 リソースを閉じる
    5.1.3 確実にリソースを解放する
    5.1.4 自動リソース管理(ARM)の使用
  5.2 ラムダ式でリソース解放
    5.2.1 リソース解放を行うクラスの準備
    5.2.2 高階関数の使用
    5.2.3 インスタンス解放に使用
  5.3 ロックの管理
  5.4 簡潔な例外テストの生成
    5.4.1 try/catchで例外テスト
    5.4.2 アノテーションを使った例外テスト
    5.4.3 例外テストにラムダ式を使用
    5.4.4 テストの実行
  5.5 まとめ


6章 「遅延させる」ということ 129
  6.1 初期化の遅延
    6.1.1 おなじみのアプローチ
    6.1.2 スレッドセーフにする
    6.1.3 間接処理を1レベル追加する
  6.2 遅延評価
    6.2.1 先行評価で開始
    6.2.2 遅延評価を設計
  6.3 Streamの遅延処理を活用
    6.3.1 中間処理と終端処理
    6.3.2 メソッド評価順
    6.3.3 「遅さ」を覗く
  6.4 無限の「遅い」コレクションを生成
    6.4.1 勇気ある挑戦
    6.4.2 星々に近づく
  6.5 まとめ


7章 再帰の最適化 151
  7.1 末尾呼び出し最適化を使う
    7.1.1 最適化前の再帰
    7.1.2 末尾再帰に変換する
    7.1.3 TailCall関数型インタフェース
    7.1.4 TailCallコンビニエンスクラス
    7.1.5 末尾再帰関数を使う
    7.1.6 再帰を綺麗にする
    7.1.7 算術オーバーフローを修正する
  7.2 メモ化でスピードアップ
    7.2.1 最適化問題
    7.2.2 何の変哲もない再帰
    7.2.3 計算結果のメモ化
  7.3 まとめ


8章 ラムダ式で合成 169
  8.1 関数合成の利用
  8.2 MapReduceの使用
    8.2.1 計算の準備
    8.2.2 命令型スタイルからの脱出
    8.2.3 そして関数型へ
  8.3 並列化への飛躍
  8.4 まとめ


9章 すべてをまとめて 183
  9.1 関数型スタイルで成功するために実践すべきこと
    9.1.1 宣言的により近く、命令型からより遠く
    9.1.2 不変性の尊重
    9.1.3 副作用の削減
    9.1.4 文より式を優先
    9.1.5 高級階数を利用して設計
  9.2 パフォーマンスの問題
  9.3 関数型スタイルを採用


付録A 基本的な関数型インタフェース 193
  A.1 Consumer
  A.2 Supplier
  A.3 Predicate
  A.4 Function


付録B 構文の基礎 197
  B.1 関数型インタフェースの定義
  B.2 パラメータを持たないラムダ式の生成
  B.3 パラメータ 1つのラムダ式の生成
  B.4 ラムダ式のパラメータ型を推論する
  B.5 パラメータ 1つのラムダ式では括弧を省略可能
  B.6 複数パラメータを持つラムダ式の生成
  B.7 複数の型のパラメータを持つメソッドを呼び出す
  B.8 ラムダ式を変数に格納
  B.9 複数行のラムダ式を生成
  B.10 ラムダ式を返す
  B.11 ラムダ式からラムダ式を返す
  B.12 クロージャにおける静的スコープ
  B.13 インスタンスメソッドのメソッド参照を渡す
  B.14 メソッド参照をstaticメソッドに渡す
  B.15 メソッド参照を他のインスタンスのメソッドに渡す
  B.16 複数の引数を取るメソッドの参照を渡す
  B.17 コンストラクタ参照を使う
  B.18 関数合成


付録C Web上のリソース 203


付録D 参考文献 207


訳者あとがき(和田祐一郎 2014年8月) [208]
索引 [209-212]
著訳者紹介 [213]