ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2021年5月15日土曜日

トランザクションデータのグループ化(JavaとPython)

    【what is this】トランザクションデータなど、複数のカラム(キー)からなるデータを、特定のいくつかのカラムについて、階層的にグループ化したい場合があります。JavaとPythonを使って、簡単な例で試してみます。

 本記事で扱う小さなデータ(csvファイル)とソースコード(JavaとNotebook形式Python)はこちらにありますので、よろしければお使い下さい。

例題:トランザクションデータ(通貨取引)のグループ化
 何をしたいのかを、図1で説明します。図1(a)は、参考資料[1]のcsvデータを若干編集したものです。先頭行は、3つのカラム名(City, Currency, Value)を示しています。2行目以降のトランザクションを集約して、右側の(b)に示すように、取引所(City)でグループ化し、さらに通貨(Currency)毎の取引額(Value)の平均値を求めたい。この処理は、初歩的なプログラミングでも可能ではありますが、恐らく、込み入ったものになるでしょう。ここでは、分かりやすく、効率的なプログラムにしたいのです。


JavaのStream、groupingByの利用
 図2に示したJavaプログラムは、StreamとCollectionのチュートリアルである参考資料[1]を参考にしています。まず、1〜2行目で上記のcsvデータを読み込み、3行目でトランザクションを3つのカラム対応のデータに分割しますが、データの先頭行は不要なので4行目のfilterで削除します。5行目では、各トランザクションに対するオブジェクトを生成しています。そのクラスの定義は(b)にあります。このオブジェクトのプロパティを利用して、6〜7行目で、Cityについてグループ化し、さらにCurrencyについて纏めてそれらの平均値を得ています。ストリームに対するgroupingByが2重に適用されているところがポイントです。ここで、例えば、「Tranz::getCity」は、トランザクションオブジェクトに対して、一斉にクラスTranzのメソッドを適用する(Cityデータを得る)ことを意味します。8〜11行目は結果の出力表示です。


 1〜7行目までの、2重のグループ化では、if文もforループ文も使われておらず、処理の流れを把握しやすいのが魅力です。実行結果は、図1(b)のようになります。

 Pythonのpandas、groupbyの利用
 次に同じことを、資料[2]を参考にしてPythonでやってみます。グルーピングの考え方はJavaの場合と同じですが、Pythonでの記述量は、図2(a)のように大幅に少なくできます。実質1行(4〜5行目に渡る)で、右側の(b)の実行結果が得られます!素晴らしいですね。PythonのモジュールPandasを使っており、そのなかのgroupbyが効果的に働いています。そして、Javaの場合に切り捨てた先頭行のカラム名(City, Currency, Value)が、自動的に内部で生成されるオブジェクトに対応しています。


 このように、PythonのPandasは効率的プログラミングに貢献しています。しかしながら、これで全面的にPythonの勝利ということではないでしょう。Javaの場合は、明示的に生成したオブジェクトと一連の処理がstreamとして分かりやすいという捨てがたい魅力があります。また、JavaのStream(とそしてラムダ式)は、マルチコアマシン上での並列実行性能を高めるためにあるとも言われますので、大規模データ処理の場合の性能比較も楽しみになります。

[参考資料]
[1] Raoul-Gabriel Urma, "Java SE8ストリームを使用したデータ処理(パート1 & パート2)", Oracle.com/JavaMagazine, March/April, 2014.
[2] Soner Yıldırım, "3 Python Pandas Tricks for Efficient Data Analysis",
https://towardsdatascience.com/3-python-pandas-tricks-for-efficient-data-analysis-6324d013ef39

2020年6月19日金曜日

植物に関する自由記述のJSON化とJavaラムダ式とストリーム(B)

前報(A)の続編です。

(2020-6-21, [検索例(その3)]を追加しました。)

今回の進展
 約3,000行の自然言語による自由形式記述(参考文献[1]にある、植物の一行記述)から、その内容を反映するJSONテキストを自動生成しています。原文に対して係り受け解析を行い(CaboChaにより)、それに基づいてJSONを生成します。係り受け解析結果とJSON生成結果の妥当性検査と、それにもとづいた原文の一部変更という作業を続けてきましたが、このほど終了しました。
 まだまだの状態(JSON自動生成のバージョンはVersion 0.5)ですが、一通りできましたので、以下のとおり、再度いくつかの検索を行ってみました。

自動生成JSONテキストに基づく植物の検索例
 最初の例は、「葉が"倒披針"を含み、花が"白"または"紫"を含む植物」です。検索する主要部は下図のように、Javaの1ステートメントですみます。図中で、jsonStream1は、自動生成したJSONファイルをストリーム化したものです。メソッドbQやpPは小生作成のものです。妥当な検索結果が得られているはずです。

 
 次の例は、「果実のタイプ(type)」を列挙するというものです。上記のその(1)では、.filterと.forEachを使いましたが、ここでは、.mapと.collectを使っている点が違います。概ね妥当(係り受け解析結果の解釈に一部少しの不具合がありますが)な結果のようです。すなわち、このデジタル植物写真集に現れる果実のタイプを概ね列挙しているはずです。


 最後の例は、植物の区分(カテゴリ)毎に"葉"の特徴の記述を集約したものです。多少、処理は複雑にはなりますが、JavaのStreamを処理する強力なgroupingByメソッドのおかげで、見通しのよいコードが書けます。



今後は...
 以上のとおり、植物の葉、花、果実に関するいろいろな検索が少し楽にできるようになったと思います。一方、現状では「穂」や「樹皮」や「茎や根」に関しては、まだJSON生成の対象としていません。今後検討したいと思います。

参考資料
[1] 渡辺 坦:植物の名前を探しやすいデジタル植物写真集
http://plantidentifier.ec-net.jp

2020年6月14日日曜日

植物に関する自由記述のJSON化とJavaラムダ式とストリーム(A)

本記事は、(その3)の続編ですが、少しタイトルを変更しました。

今回の問題設定
 参考資料[1]には、植物を見つけるための1行記述が2,965行(ただしこのうち849行は別名)掲載されています。すなわち、実質約2,100種の植物が掲載されています。そのうちの2例を図1に示します。ここで、例えば、「葉に"楕円"を含み、花に"白"を含む植物」と、そうではなく「果に"楕円"を含み、花に"白"を含む植物」を見つけたいとします。


 単にキーワードとして"楕円"や"白"を含む行を探索するのでは、明らかに妥当な結果が得られません。そのため、自由記述文に形態素解析と係り受け解析を施し、それを基に適切にJSONテキストを生成し、それを使って探索すべきということになりました。

係り受け解析とそれに基づくJSON化は容易か?
 上記のようにして、係り受け解析結果をJSON化することは、実際に行ってみるとそう簡単ではありませんでした。それは、係り受け解析結果が、原文の意味とは異なるケースが少なからずあるからです。その多くの場合、原文に句読点を補う(1文に含まれる複数の単文の区切りを明確にする)こと等で解決しますが、時にはどうしても原文を変更せざるを得ませんでした。その作業は、1行づつ人手で確認しながら進める必要がありました。約3,000行ありますので、1日100行づつ根気強く、確認変更作業を進めています。約1ヶ月かかりますが、まもなく完了します!

 自由に書かれた文の自然言語解析には色々な困難があります。係り受け解析も、簡単なルールだけでは処理仕切れず、機械学習を行っているはずです。人工知能を搭載して、華々しく街へ繰り出した自動運転車もすでに死亡事故を何件か起こしています。学習データの周到な準備は必然ですし、人手による評価修正のフィードバックが必要な状況は続くでしょう。今回のように、3,000件くらいやってみてようやく、自然言語処理の本質が少し見えた来たような気がします。

Javaで自然言語解析する良さがここに現れた
 このように、まだ試行途中なのですが、これまでの作業結果をもとに、上記で設定した問題をやってみました。すなわち、以下の探索を可能にするJavaプログラムを作成しました。
 (1)葉に"楕円"を含み、花に"白"を含む植物
 (2)果に"楕円"を含み、花に"白"を含む植物


 詳しいことは略しますが、図2において、jsonStreamは、生成したJSONテキストをストリーム(stream)化したものです。このストリームの中味は、JSONオブジェクトです。そうなると、ラムダ式を使ったfilterや終端処理としてのforEachの出番です!Javaを使った自然言語処理の良さがここにも現れた気がします。

生成したJSONテキストの概要
 未完成ですが、図3のようなJSONテキストが、係り受け解析結果から自動生成されましたので、ご参考までにその一部をご紹介します。(このJSONテキストは、整形すると全体で約55,000行になります。小生の研究用に生成したものですので、当面、公開はしません。)


参考資料
[1] 渡辺 坦:植物の名前を探しやすいデジタル植物写真集
http://plantidentifier.ec-net.jp

2020年3月19日木曜日

もう一つのJavaアプリケーション開発環境 BlueJ

要旨教育向けの、Javaアプリケーション開発環境として、BlueJがあります。大学で使用されている下記の著名なJava教科書の幅広い例題をこれで稼働させて、その有用性確認しました。

BlueJについて
   Javaアプリケーション開発環境として、Eclipseは広く普及しています。これに対して、BlueJ[1]は、約20年の歴史を持つ、教育向けの優れたJava開発環境として知られています。Oracleがサポートし、J. Goslingも絶賛しています!国内では知名度はあまり高くないようですが、日本語解説書[2]もあります。Eclipseは、Java以外の言語での開発も可能な非常に高機能なのに対して、BlueJはJavaに特化した簡潔で親しみやすい特徴があります。したがって、もしも、現在大学のJava授業で使われている最も高度と思われる教科書[3]の例題が、全て完全に動くのであれば、BlueJを使うという選択肢も生まれるのではないか。今回の記事はそれを検討したものです。


今回の実証実験に使用した教科書の例題
   多くの大学で利用されており、Javaの基本事項を幅広く網羅した高度で精緻な以下の教科書[3]の例題を対象としました。これらの例題は、Java8に準拠したものですが、BlueJの最新版はJava11に準拠しています。したがって、言語仕様面からは問題なくBlueJでも動くはずです。しかしながら、現実には、実行環境の相違などから問題があるかも知れません。それを確認するのです。


   この教科書の例題は膨大な数に上りますので、できるだけ広範囲に考えて、以下の8題を選択して検証することにしました。

第5章:T51.java
  (1)クラスとメソッドを説明する、簡単なタートルグラフィックス
第6章:Args61.java
  (2)mainメソッドに実行時に与えられるパラメータの利用
第12章:ExecutorExample.java
  (3)エグゼキューターサービスを用いた平行実行。ラムダ式も使用。
第12章:StreamTurtle.java
  (4)並列ストリームの処理の流れ。ラムダ式も使用。
第14章:Standup.java
  (5)JavaFX、CSSファイル、アクションイベント処理
第15章:ShapeEventExample.java
  (6)JavaFX、マウスによるShapeイベント処理
第16章:FileReadWrite2.java
  (7)テキストファイルを行毎に読んで表示
第17章:WeatherClient.java
  (8)HTTPクライアント。外部jarでJSONファイルデコード。

BlueJのプロジェクトとパッケージ
   ここでは、Mac版BlueJを使いますが、特に何の設定も無しにすぐに使えます。Windows版でも同じだと思います。また、Raspberry Pi等には標準でBlueJが組み込まれているようです[4]。
 
   上記例題のJavaソースファイルは、それが属する章の名称(例えば第17章ならばchap17)のパッケージに入っています。BlueJのプロジェクトでも、パッケージ構造はそのまま使うことができます。下図をごらん下さい。なお、各パッケージを開くと、それに属するJavaソースファイル名を確認できます。クラス間の依存関係は、自動的に矢印で表示されます。非常に見やすく、親しみやすいと感じます。


BlueJでの実行状況
   予想どおり、上記8題は特に問題なく、完全に動作しました。ソースコードの変更は一切不要でした。言語仕様の上位互換性からこれは当然ではありますが。ただし、画像ファイル、テキストファイル、CSSファイルの配置場所は、プロジェクトの直下にします。これは、Eclipseの場合と同じですが、環境が違うので注意が必要です。また、例題(8)でのJSONを扱うための外部jarファイルを取り込む手順、例題(2)でのmainメソッドに実行時パラメータを与える方法に注意すればよいです。詳細は、末尾のTipsをご覧下さい。

   以下に、例題(3)と例題(8)の実行状況を示します。ソースファイルエディタも、構造が色分けされて見やすいと思います。



結論
   以上の検討結果(8題の実行実験)から、恐らく、この教科書のぼぼ全ての例題は問題なく実行できるという感触を得ました。したがって、BlueJは、大学でのJavaプログラミング環境として十分活用できると思われます。Eclipseよりも軽快であり、必要にして十分な機能があると考えます。特に、初心者にはより優しい環境であり、親しみやすく、取り組む意欲を低下させないと言えます。

Tips ...

 (1) 画像、テキスト、CSSファイルの配置
   プロジェクトの直下(パッケージの中ではなく)置けば、"lay.jpg"のように、ファイル名を直接指定することで参照できる。もしも、これ以外の別の場所に置くのであれば、以下のように、絶対パスで参照すればよい。
private static final String RESULTS_FILE = "results.txt”;
Path resultsFile = Paths.get(RESULTS_FILE).toAbsolutePath();
FileWriter writer = new FileWriter(resultsFile.toString());
また、例えば、 "results.txt”ファイルをパッケージresに置くのであれば、"/res/results.txt"として参照できる。
CSSファイルは、プロジェクトの画面に出現するが、テキストや画像ファイルはそこには現れないので、別途何らかの方法で参照する。

 (2) 外部jarファイルの追加
   jarファイルを、プロジェクトの直下へ配置する。その後、
BlueJ -> カスタマイズ -> ライブラリで「ユーザライブラリ」に、AddFileを押して、jarファイルを指定 -> OKを押す。
その後、BlueJを再起動すれば、そのjarファイルのクラスをimportできる。

 (3) mainメソッドの引数に、実行時にパラメータを渡す
   mainメソッドを起動するウインドウに{ }が出現するので、その中に、以下のようにパラメータを指定する。各パラメータとも、ダブルクオーテーションが必要。
例:{"apple", "orange", "10"}

参考資料
[1] BlueJ公式Webサイト
https://www.bluej.org
[2] 深瀬欽正:Java新入門 学習環境BlueJでスイスイ、リックテレコム
[3] 立木秀樹・有賀妙子:すべての人のためのJavaプログラミング第3版、共立出版
https://www.i.h.kyoto-u.ac.jp/users/tsuiki/javaEveryone3/index.html
[4] Raspberry PiでのJavaコーディング
https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JF15-NewToJava.pdf



2019年2月20日水曜日

JavaのCompletableFutureによる並行処理

 Javaでは当初から、平行プログラミングが重視されてきました。近年のコンピュータはマルチコア化(メニコア化)が進んでいるので、マルチスレッドによる並列化はさらに重要性を増しています。最近のJavaは、強固なコンカレントパッケージを提供していて、高レベルで、スレッドセーフなコレクションや、スレッドプールを利用できます。これによって、ユーザは、明示的にスレッドを開始することもなく、またロックを使用することもなく、並列プログラムを書くことができるようになってきました。

 ここでは、これらのうちで、FutureクラスとCompletableFutureクラスを取り上げます。下記のJava書籍[1]の第12章には、「マルチスレッドと平行処理」が詳しく解説されています。その中にある例題を参考にして検討します。例えば、以下の図1ような図を描くとします。まず、5角形と8角形をそれぞれ別のスレッドで並行してして描きます。それら両方の描画が完了するのを待って、次に外側に4角形を描きます。この四角形の一辺の長さは、図に示したように、5角形と8角形を描き終わった後に決まるとしています。(短いビデオもご覧ください。)


図1 5角形と8角形を並列に描いた後に、外側に四角形を描く

これらの多角形を描くメソッドpolyDとpolyVを以下のように定義します。
 double polyD(int x, int y, int n, int s)
 void polyV(int x, int y, int n, int s)
  x, yは多角形描画の開始点の座標
  nは頂点の数
  sは一辺の長さ
  polyDは、n * sの値を返します。

 まず、ExecutorとFutureを使ったプログラム(リスト1)を以下に示します。ExecutorService(スレッドプール)を使って、2つの多角形の描画を別々のスレッドへsubmitします。(line 21-23)すると、Futureオプジェクトx1, x2が直ちに返ってきます。したがって、描画を待たずに、両方の多角形の周の長さの和を求める計算(line 25)の開始に向かいます。しかし、ここで、x1.get()とx2.get()が呼び出されていることに注意しましょう。すなわち、このget()は、それぞれの多角形の描画の完了を待つことを意味します。それが終わった後に、外側の四角形が描かれます。(line 26)

リスト1 ExecutorとFutureによる、並列描画+逐次描画

 次に、文献[2]などを参考にして、CompletableFutureを使ったプログラム(リスト2)を以下に示します。これは、上記のExecutorとFutureを使ったプログラムと完全に同じ動作をします。しかし、注目すべきは、これが1ステートメントで完結していることです。Threadプールの利用も、2つの多角形描画の待ちも明示されていません。5角形と8角形の描画のための2つのCompletableFutureが、.thenCombineAsynによって連結され、さらにその後に起こる、四角形の描画も.thenAcceptで連結されています。並行処理部分があるのに、すべてが一気にパイプライン連結されています。なお、line 34は、両方の多角形描画の後に得られる、周の長さの和を計算するラムダ式です。

リスト2 CompletableFutureによる、並列描画+逐次描画
(全体が1ステートメントで完結)

 リスト1も十分明快ではありますが、このリスト2の方が、さらに洗練されたエレガントなプログラムであると言えるのではないでしょうか!別の言い方をすると、リスト1は、「ここで待て。そこで計算して、その結果を使って次の描画をせよ。」という命令的なのに比べて、リスト2は「2つの並行処理が終ったらその結果を使って次の描画を行う。」という仕様的記述だとも言えます。もちろん、状況により、使い分けることになるでしょう。

 リスト1とリスト2の両方に言えることですが、Java8で導入されたLambda Expressionsが重要な役割を果たしていることも再認識できると思います。

 さらに複雑な図2のような並列描画プログラムも、このCompletableFutureを使って書いてみます。これは、図1の描画を2つ横に並べて同時に描かせます。すなわち、さらに多重の並列プログラムになっています。

図2 上記の図1の並列描画をさらに2つ同時に描く

具体的なやり方は色々あるでしょうが、ここではリスト3のように、図1相当のものを2つ、.thenCombineAsyncで連結しました。なお、図1の描画に相当するプログラムは、メソッドCPF(ss)として設定しました。ここで、引数ssは、各図の描画を開始位置を決めるためのシフト量です。(なお、line 43のラムダ式(x,y)->y-xは、念のため、外側の図の開始位置の差を確認し、その値をline 44で表示していますが、特別な意味はありません。)

リスト3 図2を描くためのCompletableFutureを使ったプログラム
リスト3 図2を描くためのCompletableFutureを使ったプログラム(続)

■参考書籍
[1]立木秀樹、有賀妙子著「すべての人のためのJavaプログラミング 第3版」、共立出版
[2]C.S. Horstmann(柴田芳樹訳)「Java SE 8 実戦プログラミング」、インプレス

2018年10月28日日曜日

私には嬉しい「Javaで自然言語処理」

 機械学習全般に、そのソフトウェアの多くにはPythonが使われており、この分野ではそれが必須となっているようです。確かに、行列や数値計算やグラフ出力などで強力な機能を備えており、簡潔にプログラムを記述できます。ですから、私もPythonを使って学んだり、プログラムを書いたりしています。

 しかし、一方では、長年使ってきたJava言語の魅力は捨てがたいものがあります。そんななかで、小生が最近取り組んでいる「自然言語処理と機械学習」Javaで学ぶという書籍が発売になりました。内容はとても精緻に書かれている印象があります。当然ながら、広く使われているMeCab、CaboCha、LIBSVM、word2vecなどのツールやライブラリも、Pythonの場合と同じように、Javaと連携しています。私にとっては、とても嬉しい書籍なので、これも学びます。

私にはうれしい書籍が発売になった

2018年10月14日日曜日

Java(JDK)有償化で大学等での教育研究に支障はあるか

 Java(JDK)の有償化が話題になっています。大学等での、Javaプログラミング教育、研究への適用に支障があるでしょうか。当方の検討、実証結果(Windows10の場合)を示したいと思います。(誤解や独断、偏見もあるかも知れませんが、ご容赦ください。)



 結論特段の問題はありません。Java 有償化の後も、無償のままで(アップデートも提供され)、使い続ける道があります。当方で現在使っているJavaの教科書(立木・有賀「すべての人のためのJavaプログラミング」第3版)のJava 例題、練習問題のソースリスト(総計約300 件)はそのまま、コンパイル/実行できます。当方で実証済みです!具体的には以下のとおりです。

 検討の経緯の詳細は下記にあります。
https://www.i.h.kyoto-u.ac.jp/users/tsuiki/javaEveryone3/link.html
(ここに掲載されている「本書を解説した文章」の「付録」をご覧ください。)

 要点は以下のとおりです。

  • すでに、Eclipse の最新版(Pleiades Eclipse 2018-09 版)には、オープンソースのAdoptOpenJDK11 が組み込まれています。このJDK はOracleJDK11 とほぼ同等です。すなわち、本書の例題等は(GUIのためのJavaFX 以外は)全てそのままコンパイル、実行できます。
  • JavaFX は、OracleJDK にはバンドルされていたので、そのまま使えたのですが、AdoptOpenJDK にはJavaFX は含まれていませんでした。しかし、ご安心を。これにもオープンソースのOpenJFX というのがあります。少しだけ手間がかかりますが、これをAtoptOpenJDK11 に組み込みました(add-modulesの設定が必要)。
  • その結果、JavaFX の利用も含めた本教科書の例題等(総計約300 件)は、問題なくコンパイル/実行できるこことが確認できました。
  • このAdoptOpenJDK11 は、2018 年9 月〜2022 年9月までのLTS としてアップデートの無償提供がなされます。その後の、JDK12 以降も同様であるとのことですから、安心してJava の教育、研究への活用に使えるでしょう。

2018年8月29日水曜日

Javaの教科書サポートページに当方の解説資料を掲載していただきました

 Javaプログラミングの書籍は多数あるのですが、そのうち下記の書籍は、Java教科書として広く使われています。神奈川工科大学 情報工学科でも採用されています。現在は第3版ですが、第1版(2000年10月発行)、第2版(2007年月発行)なので、約18年間の実績があります。その間、Javaでは幾つかの大きな改訂がありましたが、それに対応して来られました。

 当方では、この第3版で学ぶに当たっての参考資料(pdf版60ページ)を作成していました。それを、著者の立木秀樹先生(京都大学)により、下記の教科書サポートページに掲載(資料ファイルへのリンク設置)していただきました。皆様にもご活用戴ければ嬉しいです。

https://www.i.h.kyoto-u.ac.jp/users/tsuiki/javaEveryone3/index.html
(このwebページの「リンク」をご覧ください。)


2018年7月17日火曜日

選択肢はあれど、Javaは使えるようにしたい

Javaプログラミングの演習をとおして、Javaの基礎を身につける。
(本記事の続編は、近々どこかに掲載します。)

Writing with pencil and typing are the basis of this world

ここでは、以下の書籍に特化して、Javaプログラミングを学び、自分の問題解決にJavaを使えるようにすることを目指します。そのためにご参考になりそうなことを書いていきたいと思います。(続編はあるかも)

立木秀樹・有賀妙子「すべての人のためのJavaプログラミング 第3版」共立出版

初版 ー 第2版 ー 第3版

■第3版についての私のコメント

初版(2000年10月発行)、第2版(2007年9月発行)、第3版(2017年10月発行)となっています。私は、大学の情報工学科でこれらの書籍を使って(一時期、別の書籍も教科書として使いましたが)Javaを教え、また、学んで来ました。現在は、学生諸君には教えていませんが、Javaプログラミングは続けています。

この教科書の第一の特徴は、「最初から」タートルグラフィックスを使って、視覚的にプログラムの動作を確認しながら、Javaの基本を学べることです。それは、初版、第2版、第3版でも変わっていません。それまで、C/C++の基礎を教えていた同僚のN先生が、私のJava授業の演習に加わった際に述べられた言葉は印象的でした。「これまでのテキスト主体の演習に比べて、こんなグラフィックスの演習はとても難しいのではないかと思っていたら、学生諸君は意外にも、グイグイとプログラムを書いて、修正して、動かしているのを見て驚きました。これは衝撃的でした!」と。

この教科書は、いわゆる「易しい教科書」に比べて、説明が緻密であり、その結果として文字数がとても多いように見えます。それが、一見、「これはかなり難しい教科書」という印象を与えるかも知れません。しかし、説明文が少なく、文字が大きく、やさしそうに見える教科書は、初心者には逆に理解し難いでしょう。なぜなら、詳しい説明がないのですから、当然そうなります。これに対して、この教科書は、説明に分からないところがあっても、例題のJavaプログラムを動かして、その結果を見ながら、プログラムの構造を見直し、さらに、本文の説明を何度か繰り返して読めば理解が深まってくるように作られています。

第3版になって、変更になった項目で大きなものは、「ラムダ式と関数型インタフェース」の導入と、「これまでのGUIが、SwingからJavaFX」へと変わったことだと思います。前者は、すでに、他の多くのプログラミング言語、例えばPythonやJavaScript等も取り入れていますので、自然な流れと思います。はじめての人は、Javaにおいて、関数をデータとして扱うことには戸惑いを感じると思います。しかし、よく馴染んでくれば、ラムダ式の導入は、従来のオブジェクト指向とうまく融合していることを感じるようになるでしょう。JavaFXへの変更は、より高度なGUI(アニメーション、マルチタッチなどを含む)を持つアプリケーションの作成容易化への要請に応えるもののはずです。なお、本書では、他の多くの書籍にみられるFXML(XMLベース)は扱っていません。これは従来のSwingからの継続性を重視したためかも知れません。

また、後半では、現代のスマートフォンからスーパーコンまでにおいて必須となっている「マルチスレッドと平行処理」に、30ページほどを費やして、丁寧な説明を行っています。その部分にも、上記の「ラムダ式と関数型インタフェース」が出て来ており、ここでも、それらの用途の理解がさらに得られるように思います。