読書会(Javaによる関数型プログラミング)第2回議事録
[ 戻る ]
===============================================================
Java読書会BOF「Javaによる関数型プログラミング」を読む会 第2回
===============================================================
.. csv-table:: 開催概要
"日時", "2016年10月22日 10:00 - 17:00"
"場所", "川崎市教育文化会館 第3会議室"
"出席者(敬称略)", "川内、青山、井上(信)、門脇、吉本、中澤、小棚木、平山、伊藤、岩室、高橋(智)、遠藤、高橋(徹)"
本日は、p.62先頭から
3.2.2 コンパレータの再利用
==========================
* pp.62,63 例3-16,3-17 ifPresentとは?
* Optional型のメソッド
* minメソッド、maxメソッドは戻り値型がOptional<T>型
* p.63 上11行目 「流暢にする」とは?
* p.29やp.55にも登場する語、メソッドチェーンで見かける
* fluent の訳
3.3 複数のプロパティによる流暢な比較
====================================
* p.64 下から5行目以降 の出力例
* 例3-19のコードは、まずソートを年齢で、次に名前で実施しているが、出力例は名前-年齢となっているので見づらい
3.4 collectメソッドとCollectorsクラスの使用
===========================================
* p.66 例3-21 collectの第2、第3引数をArrayListではなくListにできないか?
* collectの引数は3つとも共通の型パラメータRを使用しているので、3つとも同じ型(ArrayList)でないと駄目ではないか?::
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner)
* サンプルコードで第2引数をList::addにしたらコンパイル通った。
元のコード::
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
を次のように修正::
.collect(ArrayList::new, List::add, List::addAll);
* p.68 下5行目 「誤植」
* 誤) Collectorユーティリティ
* 正) Collectorsユーティリティ
3.5 ディレクトリの全ファイルをリスト
====================================
* p.70 上6行目および上18行目 「誤植」
* 誤) ClosableStreamインタフェース
* 正) CloseableStreamインタフェース
* ただし、Java SE 8正式版には、CloseableStream はない。プレビュー版にはあった。
現在は、Streamを返却する
3.6 ディレクトリの特定のファイルだけをリスト
============================================
3.7 flatMapで直下のサブディレクトリをリスト
===========================================
* p.74 下11,12行目 「プリミティブ型への執着」は?
* マーチン・ファウラー著「リファクタリング」で登場する言葉、コードの不吉な臭いの一つとして取り上げられている
* この例では、プリミティブ型が登場しないので配列のことを指しているのかも。
* p.74 下1行目 「(またはファイル)は空であったり、子を持っていない」とは?
* pp.73-75 再帰的にディレクトリを走査したいときは?
* Filesクラスのwalk()メソッドを使うとStream<Path>が得られる
3.8 ファイルの変更を監視
========================
* p.76 例3-35 ポーリングする場合、whileで回さないとだめなのでは?
3.9 まとめ
==========
4章 ラムダ式で計算する
======================
* p.79 1段落目の最後、原書の1文が訳出されていない。
We can use these to create lightweight designs that are flexible to change
and easier to extend.
4.1 ラムダ式を使った関心の分離
==============================
4.1.1 デザイン問題の探求
========================
4.1.2 問題でがんじがらめ
========================
* p.82 上8-9行目 「〜金額を0としています。」の後、原文が訳出されていない。
Instead of crowding the logic within that one lambda expression we could
use a filter() method to extract only bonds, and leave the lambda expression
that was passed to the mapToInt() method untouched from the version copied
from the totalAssetValues() method.
4.1.3 主要な関心を分離
======================
* p.85 脚注 ファイル名"Open/closed_principle"に'/'が含まれてもよいのか?
* Strategyパターンの実装は、クラス構造かラムダ式か?
* クラスにすべきケースもあるが、メソッド1つのシンプルなロジックならラムダ式がいい
4.2 ラムダ式を使った委譲
========================
4.2.1 委譲の生成
================
4.2.2 Webサービスのスタブの実装
===============================
4.2.3 Webサービスとの統合
=========================
4.3 ラムダ式を使ったデコレーション
==================================
4.3.1 フィルタをデザイン
========================
* p.93 上10行目 誤植
* 誤) target.compose(next);
* 正) target.andThen(text);
* 原書の正誤表ページ https://pragprog.com/titles/vsjava8/errata より
4.3.2 フィルタを追加
====================
* p.95 下9行目 誤植
* 誤) Color の brighter() クラスを
* 正) Color クラスの brighter() メソッドを
4.3.3 複数のフィルタを追加
==========================
4.4 default メソッドを覗く
==========================
* p.97 1段落目 誤植
* 誤) コードでは default メソッド default メソッドを使用
* 正) コードでは default メソッドを使用
4.5 ラムダ式を使った流暢なインタフェース
========================================
4.5.1 設計開始
==============
4.5.2 メソッドチェーンの使用
============================
4.5.3 APIを直感的かつ流暢にする
===============================
* p.104 例4-30 エラー処理(例外) sendメソッドの例外処理しかできない
4.6 例外処理
============
4.7 まとめ
==========
5章 外部リソースを扱う
======================
* 章題の原文は Working with Resource
5.1 リソースの解放
==================
5.1.1 問題を覗いてみる
======================
5.1.2 リソースを閉じる
======================
5.1.3 確実にリソースを解放する
==============================
* 例5-5 finally ブロックで close()をtry-catchで囲まなくてよい?
* mainメソッド自体がthrows IOExceptionしているからよい。
* finalizeを呼ばせない方法はある?
明示的にclose()を呼ばなくてもいつかGCされてcloseされるが、close()メソッドを
呼び忘れた箇所が追求しずらい。
* AspectJを使うと、メソッド呼び出しをマスク(aroundでfinalizeメソッド呼び出しを
握り潰す)できるのでは。
5.1.4 自動リソース管理(ARM)の使用
=================================
5.2 ラムダ式でリソース解放
==========================
5.2.1 リソース解放を行うクラスの準備
====================================
5.2.2 高階関数の使用
====================
* p.117 上8行目 誤植
* 誤) useInstance インタフェース
* 正) UseInstance インタフェース (先頭の'U'が大文字)
5.2.3 インスタンス解放に使用
============================
* トランザクションのロールバック処理が複雑な場合、EAMではうまくいかない。
使い分けると、一貫性がなくなる。
5.3 ロックの管理
================
* Lockのタイムアウトは?
* Lock.lock()は無限ブロッキング。 tryLock()はタイムアウト指定可
5.4 簡潔な例外テストの生成
==========================
5.4.1 try/catch で例外テスト
============================
5.4.2 アノテーションを使った例外テスト
======================================
5.4.3 例外テストにラムダ式を使用
================================
* p.123 ClassクラスのisInstance() メソッドは、サブクラスでも合致する?
* 多分する
5.4.4 テストの実行
==================
* p.125 例5-21 のソースファイル名 の誤植
* 誤) RodCutterTest.java
* 正) RodCutter.java
* p.126 5行目および16行目 誤植
* 誤) setPrice() メソッド
* 正) setPrices() メソッド
5.5 まとめ
==========
6章 「遅延させる」ということ
============================
* p.129 遅延評価
* 原文には、"evaluation"(評価) の語が使われていないが、邦訳では「評価」の語が使われ、かつ、eager evaluation、lazy evaluationと英語が括弧書きで記述されている。
6.1 初期化の遅延
================
6.1.1 おなじみのアプローチ
==========================
* p.131 例6-3 2行目 誤植
* セミコロン(;)の後に改行がない
今回は p.132 の1行目まで読みました。次回は、6.1.2 スレッドセーフにする からです。
[ 戻る ]