序文
簡単に言えば、Java8の新機能とJava9によって導入された変更(重要ではありませんが)は、21年前のJava1.0のリリース以来のJavaの最大の変更です。この進化は何も削除しないので、元のJavaコードは機能しますが、新しい機能は、より明確で簡潔なコードを書くのに役立つ、より強力な新しいイディオムと新しいデザインパターンを提供します。すべての新機能に遭遇したときと同じように、最初は「なぜ私の言語をもう一度変更したいのですか?」と思うかもしれませんが、少し練習すると、予想される時間の半分だけ新しい機能を使用することがわかります。はより短く明確なコードを記述しているので、「古いJava」に戻ることは決してできないことに気付くでしょう。
この記事は、「原則は良さそうに聞こえますが、それでも少し新しく、あまり適応性がない」というしきい値を超えて、上手にプログラミングできるようにするのに役立ちます。
「たぶん」と思うかもしれませんが、「ラムダと関数型プログラミングは、あごひげやサンダルの学者が象牙の塔で考えていることではないでしょうか?」そうかもしれませんが、Java8で追加されました。新しいアイデアはちょうどいいです、そしてそれらがもたらす利点は普通のJavaプログラマーによって理解されることができます。
この記事では、通常のプログラマーの視点からナレーションを行い、「これはどのようにして実現したのか」について時々話します。
「ラムダ、それは天国の本のように聞こえます!」はい、多分そうかもしれませんが、簡潔なJavaプログラムを書くことができるのは良い考えです。多くの人は、イベントハンドラーとコールバック関数、つまり、イベントが発生したときに使用されるメソッドを含むオブジェクトの登録に精通しています。
Lambdaを使用すると、このアイデアをJavaに広く適用することが容易になります。簡単に言うと、Lambdaとその仲間の「メソッド参照」を使用すると、他のことを行うプロセスで実行するためのパラメーターとして、コードまたはメソッドを簡潔に渡すことができます。
この記事では、このアイデアが予想よりも頻繁に現れることがわかります。比較のためのコードを追加して並べ替え方法を単純にパラメーター化することから、新しいStream APIを使用して一連のデータ命令で複雑なクエリを表現することまで、
「ストリームとは」これはJava8の新機能です。その機能はコレクションに似ていますが、新しいプログラミングスタイルを使用できるようにするいくつかの明らかな利点があります。まず、SQLなどのデータベースクエリ言語を使用したことがある場合、Javaに置き換えると、数行のコードで記述されたクエリステートメントの記述に時間がかかることがわかります。Java 8ストリームは、この種の簡潔なデータベースクエリプログラミングをサポートしていますが、データベースを理解していなくてもJava構文を使用できます。次に、ストリームは、すべてのデータを同時にメモリに転送する必要がないように(または計算をまったく行わずに)設計されているため、コンピュータのメモリにロードできないストリームデータを処理できます。ただし、Java 8は、コレクションでは実行できないストリームに対していくつかの最適化操作を実行できます。たとえば、同じストリームで複数の操作を組み合わせて、高コストで複数回データをトラバースするのではなく、1回だけデータをトラバースできます。さらに良いことに、Javaはストリーム操作を自動的に並列化できます(収集はできません)。
「関数型プログラミングもありますが、これは何ですか?」オブジェクト指向プログラミングと同じように、これは別のプログラミングスタイルであり、ラムダについて説明したときに前述したように、関数を値として使用することがコアです。
Java 8の利点は、関数型プログラミングの最良のアイデアのいくつかを使い慣れたJava構文に組み込んでいることです。この優れた設計の選択により、関数型プログラミングをJava 8の追加の設計パターンおよびイディオムと考えることができ、より明確で簡潔なコードをより短時間で記述できます。あなたのプログラミング兵器で同じより多くの武器について考えてください。
もちろん、これらの概念的に優れたJavaの拡張機能に加えて、デフォルトのメソッド、新しいオプションのクラス、CompletableFuture、新しい日付と時刻のAPIなど、他の多くの便利なJava8の機能と更新についても説明します。
Java 9アップデートには、FlowAPIを介したリアクティブプログラミングをサポートするモジュールシステムやその他のさまざまな拡張機能が含まれています。
以下では、目次とメインコンテンツから、Javaの実際の戦闘第2版まで、段階的に説明します。全文には多くのコンテンツが含まれているため、エディターは知識ポイントの一部のみを取り出して、はじめに。この記事がすべての人に役立つことを願っています。!
目次
メインコンテンツ
この記事は、「基本的な知識」、「関数型データ処理のためのストリームの使用」、「効率的なプログラミングのためのストリームとラムダの使用」、「ユビキタスJava」、「Javaの並行性の向上」、「関数型プログラミングとJavaの将来の進化」。多くの概念は前の章を基礎として必要とし、後の4つの部分の内容は任意の順序で読むことができるため、最初の2つの部分の内容を順番に読むことを強くお勧めします。ほとんどの章には、これらのコンテンツを学び、習得するのに役立ついくつかのクイズが付属しています。
最初の部分は、Java8の使用を開始するのに役立つように設計されています。この部分を学習すると、Lambda式を完全に理解し、変化するニーズに簡単に適応できる簡潔で柔軟なコードを記述できるようになります。
第1章では、次のコンテンツに備えるためのJavaの主な変更点(ラムダ式、メソッド参照、ストリーム、およびデフォルトメソッド)を要約しています。
この章の内容
- Javaはどのように再び変化しましたか
- コンピューティングアプリケーションの絶えず変化する背景
- Java改善への圧力
- Java8およびJava9のコア新機能
第2章では、Java 8が大きく依存するソフトウェア開発モデルであり、Lambda式を導入する主な理由でもある動作パラメーター化を紹介します。
この章の内容
- 変化するニーズへの対応
- 行動のパラメータ化
- 匿名クラス
- ラムダ式のプレビュー
- 実際の例:コンパレータ、ランナブル、GUI
第3章では、Lambda式とメソッドリファレンスの包括的な概要を説明します。コード例とテストは、各ステップで提供されます。
この章の内容
- ラムダチューブでヒョウをのぞく
- ラムダをどこでどのように使用するか
- サラウンド実行モード
- 機能インターフェイス、型推論
- メソッドリファレンス
- ラムダコンポジット
第2部では、新しいStreamAPIについて詳しく説明します。Stream APIを使用すると、宣言的な方法でデータを処理するための強力なコードを記述できます。この部分を学習すると、ストリームとは何か、およびJavaアプリケーションでストリームを使用してデータセットを簡潔かつ効率的に処理する方法を完全に理解できます。
第4章では、ストリームの概念を紹介し、それらがセットとどのように類似しているかを説明します。
この章の内容
- フローとは
- 収集とフロー
- 内部反復と外部反復
- 中間操作と端末操作
第5章では、複雑なデータ処理クエリを表現するために使用できるストリーム操作について詳しく説明します。それまでの間、フィルタリング、スライス、検索、マッチング、マッピング、リダクションなど、多くのモードについて説明します。
この章の内容
- フィルタリング、スライス、マッピング
- 検索、照合、削減
- 数値範囲などの数値ストリームを使用する
- 複数のソースからストリームを作成する
- 無限の流れ
第6章では、コレクターを紹介します。これは、より複雑なデータ処理クエリを表現できるようにするStreamAPIの機能です。
この章の内容
- Collectorsクラスでコレクターを作成して使用する
- データストリームを値に減らします
- 要約:削減の特殊なケース
- データのグループ化とパーティショニング
- カスタムコレクターを開発する
第7章では、ストリームを自動的に並列で実行し、マルチコアアーキテクチャを活用する方法について説明します。さらに、並列ストリームを正しく効率的に使用するために回避すべきいくつかの落とし穴について学習します。
この章の内容
- 並列ストリームによるデータの並列処理
- 並列ストリームのパフォーマンス分析
- ブランチ/マージフレームワーク
- Spliteratorを使用してストリームを分割する
第3部では、Java8とJava9の複数のトピックについて説明します。これらのトピックの手法により、Javaコードがより効率的になり、最新のプログラミングイディオムを使用してコードベースを改善できます。このパートの出発点は、高度なプログラミングのアイデアを紹介することであり、本の残りの部分はこれに依存していません。
第8章は、このエディションの新機能です。Javaプログラマーとして、Collection APIを知らない、または使用したことがない場合は、あまりにも無知です。ほとんどすべてのJavaアプリケーションは、多かれ少なかれコレクションを使用します。前の章の調査を通じて、CollectionAPIとStreamAPIを組み合わせてデータ処理クエリを構築することがいかに強力であるかを理解しました。ただし、Collection APIにはさまざまな不十分な場所もあり、使用が面倒で、多くの場合エラーが発生しやすくなっています。
この章では、Java8およびJava9のCollectionAPIの新機能について学習します。これにより、プログラミング作業がより効率的になります。まず、Java 9に新しく導入されたコレクションファクトリを紹介します。これにより、小規模なリスト、セット、およびマップの作成プロセスが大幅に簡素化されます。次に、Java 8の拡張機能を使用して、リストとセットの要素を削除または置換する方法を紹介します。最後に、マップを処理するいくつかの新しい方法を学びます
この章の内容
- 収集工場の使い方
- リストとセットを処理するために新しい慣用的なパターンを使用することを学ぶ
- 慣用的なパターンでマップを処理する方法を学ぶ
第9章では、Java 8の新機能を使用する方法と、既存のコードを改善するためのヒントについて説明します。さらに、この章では、デザインパターン、リファクタリング、テスト、デバッグなど、いくつかの重要なソフトウェア開発手法についても説明します。
この記事の最初の8つの章を通じて、LambdaとStreamAPIの能力について学びました。これらの機能は、主に新しいプロジェクトのコードで使用できます。まったく新しいJavaプロジェクトを作成している場合は、プロジェクトに新しい機能をすばやくすばやく適用する絶好の機会です。残念ながら、ほとんどの場合、まったく新しいプロジェクトを最初から始める機会はありません。多くの場合、対処しなければならないのは、古いJavaインターフェイスで記述されたレガシーコードです。
これらは、この章で説明するトピックです。コードをリファクタリングしてLambda式の使用に適応させるのに役立ついくつかの方法を紹介します。これにより、維持するコードの可読性と柔軟性が向上します。さらに、戦略パターン、テンプレートメソッドパターン、オブザーバーパターン、責任チェーンパターン、ファクトリパターンなど、いくつかの一般的なオブジェクト指向デザインパターンについて説明します。これらは、ラムダ式と組み合わせるとより簡潔になります。最後に、Lambda式とStreamAPIを使用するコードをテストおよびデバッグする方法を紹介します。
この章の内容
- ラムダ式を使用してコードをリファクタリングする方法
- オブジェクト指向のデザインパターンに対するラムダ式の影響
- ラムダ式テスト
- Lambda式とStreamAPIを使用するコードをデバッグする方法
第10章もこのエディションの新機能であり、ドメイン固有言語(DSL)に基づいてAPIを実装するというアイデアを紹介しています。これは強力なAPI設計手法であるだけでなく、ますます一般的になっています。Comparator、Stream、Collectorインターフェースなど、このモードで実装されるJavaのAPIはすでに存在します。
この章の内容
- ドメイン固有言語(ドメイン固有言語、DSL)とその形式
- APIにDSLを追加することの長所と短所は何ですか
- 単純なJavaベースのDSLに加えて、JVMで利用できる他のドメイン固有言語は何ですか?
- 最新のJavaインターフェースとクラスからドメイン固有言語を学ぶ
- JavaベースのDSLを効率的に実装するためのパターンと手法は何ですか
- 一般的なJavaライブラリとツールがこれらのパターンをどのように使用するか
第4部では、Java8とJava9の複数の新機能を紹介します。これらの機能は、プログラマーが半分の労力でコードを記述し、プログラムをより安定して信頼できるものにするのに役立ちます。Java8の2つの新しいAPIから始めましょう。
第11章では、java.util.Optionalクラスを紹介します。これにより、より優れたAPIを設計し、nullポインター例外を減らすことができます。
この章の内容
- null参照によって引き起こされる問題、およびnull参照を避ける必要がある理由
- nullからオプションへ:ドメインモデルをnullセーフな方法で書き直します
- オプションを輝かせましょう:コード内のnullのチェックを削除します
- オプションで可能な値を読み取るいくつかの方法
- 欠落している可能性のある値の再考
第12章では、新しい日付と時刻のAPIについて説明します。これは、日付と時刻を処理するときに、以前のエラーが発生しやすいAPIを改善したものです。
この章の内容
- Java8に新しい日付と時刻のライブラリを導入する必要があるのはなぜですか
- 人間と機械の日付と時刻の同時表示
- 時間の尺度を定義する
- 日付の操作、フォーマット、解析
- さまざまなタイムゾーンとカレンダーの処理
第13章では、デフォルトメソッドとは何か、それらを使用して互換性のある方法でAPIを進化させる方法、いくつかの実用的なアプリケーションパターン、およびデフォルトメソッドを効果的に使用するためのルールについて説明します。
この章の内容
- デフォルトの方法は何ですか
- 互換性のある方法でAPIを改善する方法
- デフォルト方式の使用モード
- ルールの解析
第14章はこのエディションの新機能であり、Javaのモジュールシステムについて説明します。これは、Java 9の大幅な改善であり、無秩序にスタックされた一連のパッケージを単純に組み合わせるのではなく、文書化された実行可能な方法で大規模なシステムをモジュール化できます。
この章の内容
- Javaモジュール化への道を促進する動機
- モジュールの主な構造:モジュール宣言と要求およびエクスポート命令
- Javaアーカイブファイル(JAR)の自動モジュール
- モジュール性とJDKライブラリ
- Mavenを使用して複数のモジュールを構築する
- 要件とエクスポート以外のモジュールディレクティブの概要
第5部では、Javaの高度な機能を使用して並行プログラムを構築する方法について説明します。第6章と第7章で紹介したストリームの並行処理については説明していないことに注意してください。
第15章は、このエディションの新機能です。マクロの観点から非同期APIの概念を紹介します。これには、Futureや、リアクティブプログラミングの背後にある「パブリッシュ/サブスクライブ」プロトコル(Java9のFlowAPIにカプセル化されています)が含まれます。
この章の内容
- スレッド、Futures、およびJavaをプッシュしてより豊富な並行APIをサポートする進化力
- 非同期API
- 「ワイヤーフレームとパイプライン」の観点から並行コンピューティングを見る
- CompletableFutureコンバイナーを使用して、ワイヤーフレームを動的に接続します
- Java9リアクティブプログラミングフローAPIの基礎を形成する「パブリッシュ/サブスクライブ」プロトコル
- リアクティブプログラミングとリアクティブシステム
第16章では、CompletableFutureについて説明します。これにより、複雑な非同期計算を宣言型で表現できるため、StreamAPIの設計を並列化できます。
この章の内容
- 非同期計算を作成し、計算結果を取得します
- 非ブロッキング操作を使用してスループットを向上させる
- 非同期APIを設計および実装する
- 同期APIを非同期で使用する方法
- 2つ以上の非同期操作をパイプライン化してマージする方法
- 非同期操作の完了ステータスの処理方法
第17章もこのエディションの新機能であり、Java9のFlowAPIを詳細に紹介し、リアクティブプログラミングの実用的なコード分析を提供します。
この章の内容
- リアクティブプログラミングとは何ですか?リアクティブ宣言の原則
- アプリケーションレベルおよびシステムレベルのリアクティブプログラミング
- リアクティブストリームとJava9 FlowAPIの使用例
- 広く使用されているリアクティブライブラリ-RxJava
- RxJavaを使用して複数のリアクティブストリームを変換および統合する方法
- 大理石の図を使用して、リアクティブストリームの操作を視覚的に記録する方法
第6部は本の最後の部分です。Javaで効率的な関数型プログラムを作成する方法と、Javaの機能をScalaと比較する方法について説明します。
第18章は、いくつかの用語を紹介し、Java8で関数型プログラムを作成する方法を説明する完全な関数型プログラミングチュートリアルです。
この章の内容
- 関数型プログラミングを行う理由
- 関数型プログラミングとは
- 宣言型プログラミングと参照透過性
- 関数型Javaを作成するためのガイドライン
- 反復と再帰
第19章では、高階関数、カリー化、永続データ構造、遅延リスト、パターンマッチングなど、より高度な関数型プログラミング手法について説明します。この章では、コードベースで使用できる実際の手法だけでなく、より知識のあるプログラマーになるための学術的な知識についても説明します。
この章の内容
- 一流のメンバー、高レベルのメソッド、カリー化、およびローカルアプリケーション
- 永続的なデータ構造
- Javaストリーム生成時の遅延計算と遅延リスト
- パターンマッチングとJavaでの適用方法
- 参照透過性とキャッシング
第20章では、JavaとScalaの機能を比較します。Scalaは、Javaと同様に、JVMに実装されている言語です。近年急速に発展し、プログラミング言語エコシステムにおけるJavaのいくつかの側面を脅かしています。
この章の内容
- Scala言語とは
- JavaとScalaはどのように連携しますか?
- Scalaの関数とJavaの関数の違いは何ですか
- クラスと特性
第21章では、Java 8を学び、関数型プログラミングにゆっくりと移行するこの旅を振り返ります。さらに、Java 8、9、および10で追加された小さな機能の後に、将来どのような拡張機能と新機能が表示されるかについても推測します。
この章の内容
- Java8の新機能とプログラミングスタイルへの破壊的な影響
- 真新しいJava9モジュールシステム
- Javaは6か月ごとにインクリメント-リリースライフサイクル
- Java10の最初のインクリメンタルリリースを形成します
- Javaの将来のバージョンで何が新しくなる可能性があるか
この[JavaActual Combat 2nd Edition]は615ページあります。コンテンツが多すぎるため、ここではあまり紹介しません。フルバージョンが必要な場合は、この記事を転送してエディターをフォローし、コードをスキャンして取得できます。それ!!!
この記事があなたが学び、注意深く読み、柔軟に使用できるようになり、習熟を達成するために努力するのに役立つことを願っています。また、この記事がすべての人に好かれることを願っています!