読書会(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 スレッドセーフにする からです。


[ 戻る ]