はじめに
近々、Java 8をメインにした開発プロジェクトに参加することになったのですが、自分の Java の経験って 1.4 でほぼ止まっているのですよね。💦
なので、Java 8 で導入された Stream API やラムダ式などは、まさに異次元のお話で、これは大変なことになったと Java 8 の勉強を始めることにしました。
ですが、最初に購入した本がひどくて、「Stream はストリームを作成します」といった説明を当たり前のようにする本で、まったく分かりませんでした。
そんなとき、Twitter でkazenetuさんとYSRKENさんから、『Java本格入門』が Java 8の勉強によいと紹介されたので、速攻でポチって読み始めました。
そうしたら、その内容のよいこと。控えめに言って神ですね!
どんな点がよかったか、内容をピックアップしてご紹介します。
Stream APIとラムダ式
Java 8で大きく変わったと言えば、Stream APIとラムダ式ですよね。
Stream API とは、本書によれば以下のものになります。
Stream API は、大量データを逐次処理する「ストリーム処理」を効率的に記述するための手段として導入されました。
うん。最初の本とは全く違いますね。
そして、ラムダ式とは。。
ラムダ式は、メソッドの引数に処理そのものを渡すことができるかのような、強力な記法です。
とのこと。「処理」とはラムダ式で書かれた関数のことですね。
Stream API は、「作成」「中間操作」「終端操作」という3つの操作でストリームを処理します。ラムダ式も含めたサンプルとして以下のコードがあります。
List<Student> students = new ArrayList<>(); students.add(new Student("Ken", 100)); students.add(new Student("Shin", 60)); students.add(new Student("Takuya", 80)); students.stream(). //「作成」Stream インスタンスを生成する .filter(s -> s.getScore() >= 70) //「中間操作」scoreが70以上のStudentの抽出 .forEach(s -> System.out.println(s.getName())); //「終端操作」名前を表示する
Java 1.6(自分は1.4)までの知識ではさっぱり分からないコードですね。
ですがご安心を。
この分からないコードを、段階を踏んで詳しく本書は解説しています。
Java 7以前との比較もあるので、Java 8未経験者であっても理解しやすいと思います。
本書で、Stream APIとラムダ式の基本は学べますので、あとは実践で経験を積んでいくだけですね。
配列とコレクション
配列とコレクションについても、分かりやすい解説でした。
配列は基礎から順を追って説明し、コレクションの解説も分かりやすかったです。
特に、コレクションのインターフェースには、List, Map, Set の3種類があるのですが、各インターフェースの実装について、どのような使い分けを行えばよいか解説されているのがよかったです。
例えば、List インターフェースでは以下のような感じです。
・配列の途中で要素の追加や削除をおこなうことが多い → LinkedList
・for文などを使った全体的な繰り返し処理が多い → ArrayList
・複数スレッドから同時にアクセスする → CopyOnWriteArrayList
どの言語の解説本でもそうですが、言語仕様については解説されているのですが、使い分けについて解説されている本ってほとんどないですよね。そういう意味でも神本だと思います。
オブジェクト指向
オブジェクト指向については、プリミティブ型と参照型の値の渡し方について解説されているのがよかったですね。
クラスのインスタンスなどは参照渡しなのですが、これを理解していないケースはたまにあると思うので。
副作用が怖いのですよね。
また、インターフェースと抽象クラスの違いを、その性質から解説がされています。
ポリモフィズムも扱われていますね。
また、インターフェースのデフォルト実装についても解説されています。
インターフェースのデフォルト実装は、インターフェースに抽象クラスのように実装を行え、実装クラスでそのまま使えるものになります。
興味深いのが、インターフェースのデフォルト実装は、Stream API を導入するために追加された機能だということです。
なんでも、互換性を維持するための苦肉の策だったようですね。
この背景を踏まえると、デフォルト実装を行いたい場合は、インターフェースではなく、従来どおり抽象クラスを使用することがよいそうです。
スレッドセーフ
スレッドセーフでは、マルチスレッドとはそもそもなにかということを、人間のタスクを例として解説されているのがよいですね。
そして、マルチスレッド下ではメリットもあるけれども、さまざまなデメリットがあり、その対策を行う必要があります。
その1つに「ステートレスにする」にするというのがあり、具体的には「属性は処理するメソッドの引数に変更して削除する」ことです。他にもいくつかの対策があります。
Java で同期実行といえば synchronized ですが、実際には同期実行にならないケースが結構たくさんあることが紹介されているのもよかったです。
デザインパターン
なんと、本書ではデザインパターンも扱っています。
GoF (Gang of Four)のデザインパターンのうち、よく使われるであろう8パターンを解説しています。
実装例がシンプルで分かりやすいのもあるのですが、どのようなケースでデザインパターンを使用すればよいのか書いてあるのがいいですね。デザインパターンを勉強しても、使いどころがないというか分からないケースも多いでしょうから。
例えば、Command パターンでは以下のような感じです。
たとえば、販売サイトでの割引計算を考えてみましょう。(中略)これを実現するための手段が、Command パターンです。
長いので中略しましたが、実際の割引計算で使えるというのが分かるのがよいですね。
その他
他にも大きな項目でもよいと思った項目はあるのですが、絞らせていただきました。例えば例外処理などは、開発プロジェクトで必須といえるノウハウでしょう。
細かい部分で言えば、文字列操作には StringBuilder と StringBuffer の2つがあるけれどもその使い分けとか、ArrayList の内部配列はデフォルト10なので、10を超える場合はコンストラクタで要素数を指定した方がパフォーマンスがよくなるとかありましたね。
おわりに
この本は Java 8を学ぶのにはおすすめで、ほんとうによい本です。
古い Java の経験者の方や、Java 中級者の方にとっても非常に勉強になります。
若干高度なトピックを扱ってくれる、数少ない良書ではないでしょうか。
一方で、初心者の方にはハードルがちょっと高いので、入門書を終えてから読んでみるのがよいと思います。
この本はおすすめですね。
Java本格入門 ~モダンスタイルによる基礎からオブジェクト指向・実用ライブラリまで
- 作者: 谷本心,阪本雄一郎,岡田拓也,秋葉誠,村田賢一郎,アクロクエストテクノロジー株式会社
- 出版社/メーカー: 技術評論社
- 発売日: 2017/04/18
- メディア: 大型本
- この商品を含むブログを見る