6章「遅延させる」ということ

進歩は、簡単な方法を探す無精者によってもたらされるものである。

――Robert A. Heinlein

Javaではほとんどの場合、すぐにコードを実行します。例えば、引数はメソッドが呼び出されたその瞬間に評価されます。もちろんこれには理由があります。すぐに実行するコードは簡単に記述でき、容易にその仕組みを理解できるからです。しかし、実行を可能な限り後回しにすることは優れたアジャイルの習慣です。コードの実行を少し遅らせるだけで実行時のパフォーマンスが向上することもあります。すぐに実行されるコード(先行評価、eager evaluation)はシンプルですが、遅延評価(lazy evaluation)を行うコードは効率的です。そして、Javaでもコードの実行を遅らせて、シンプルに効率よくできるようになりました。

プログラム内で重いオブジェクトを使っている場合、そのようなオブジェクトの生成は可能な限り後回しにして、コストの高い計算はそれが本当に必要となる時点まで遅らせておきたいものです。しかし、逆説的ですが、遅延実行には煩わしい作業が必要です。サボるために面倒な作業をしたい人がいるでしょうか? Java 8では面倒な作業は必要ありません。ラムダ式がプログラムの実行を「遅らせ」、速く動作させてくれます。

本章では、重いオブジェクトの生成を遅らせるタスクから始めます。その次に先行評価を行うコードを遅延評価を行うコードに変換します。そして最後にStreamに標準で用意されている遅延評価の仕組みを使って、無限の遅延実行シーケンスを生成します。本章のテクニックは簡潔で、より速く動作し、より知的に見えるプログラムの記述に役立ちます。

6.1 初期化の遅延

オブジェクト指向プログラミングにおいては、オブジェクトはメソッド呼び出しが発生する前に適切に構築されていなければなりません。カプセル化し、適切な状態遷移を確実に行い、オブジェクトの不変条件を保持します。これでほとんどの場合は問題なく動きますが、オブジェクト内部に重いリソースが存在する場合、その生成を後回しにできれば有益です。オブジェクトの生成を加速でき、使用されない可能性があるものの生成に貴重な時間を費やすこともありません。 ...

Get Javaによる関数型プログラミング ―Java 8ラムダ式とStream now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.