[モダンジャワ動作]ch.1
9065 ワード
Ch.1 Java 8,9,10,11:何があったの?
JAva 8が現れる前はどうなりますか?
歴史の流れ.
次のコードは、アップルのリストを重量順に並べたコードです.Collections.sort(inventory,new Comparator<Apple>(){
public int compare(int a, int b){
return a.getWeight().compareTo(b.getWeight());
}
});
しかし,このような4行コードにjava 8が出現し,以下のように実現できる.inventory.sort(comparing(Apple::getWeight));
以上のコードの説明は後で本で紹介します!
Collections.sort(inventory,new Comparator<Apple>(){
public int compare(int a, int b){
return a.getWeight().compareTo(b.getWeight());
}
});
inventory.sort(comparing(Apple::getWeight));
マルチコアCPUの大衆化のようなハードウェアの変化はjava 8に影響を及ぼした.
Java 8が登場する前に、残りのコアを活用したい場合は、スレッドを使用したほうがいいです.ただし、スレッドを使用すると管理が難しく、多くの問題が発生する可能性があります.
Javaは、このような並列実行環境を管理しやすくし、エラーの少ない方向に進化させるように努力しています.
JAva 5およびjava 7には、パラレル実行環境をサポートするツールも導入されています.しかし、開発者が使用するのは容易ではありません.JAva 8は、パラレル実行への新しい、簡単なアクセスをサポートします.
ストリームAPI
ストリームAPIは、データベースクエリ言語で式を処理するように、並列演算をサポートするAPIです.
Streamとは?
連続データ・アイテムのセットを一度に作成します.
それを自動車メーカーにたとえる.自動車生産工場の各作業場は自動車の修理を受けた後、次の作業場に他の作業を処理する.複数の自動車からなる生産ラインをストリームと理解することができる.
ストリームAPIのコア
JAva 8にjavaがあります.util.ストリームAPIがストリームパケットに追加されました.
ストリームAPIの核心は,我々が行うべき仕事を高標準のストリームとして抽象化し,一連のストリームとして処理できることである.また、ストリームラインを使用して、入力部を複数のCPUコアに簡単に割り当てることもできます.スレッドを使用せずに無料で並列性を得ることができます.
反復モードで所定の条件に従ってデータをフィルタリングしたり、データを抽出したり、データをグループ化したりする機能を有する.
コレクションをストリームに変換し、並列に処理してリストに再復元することで、データのフィルタリングとパケット化を迅速に行うことができます.
メソッドにコードを渡す
Java 8から、コードの一部のAPIをユーザに渡すことができる.sortの方法を考えてみましょう.
例えば2013 UK 00012014 US 0002...等形式の請求書IDがあるとします.最初の4つの数字は年を表し、後の2つの数字は国コードを表し、最後の4つの数字は顧客IDを表します.この請求書IDを顧客IDまたは国コード順にソートする必要があります.すなわち、sortは、sortが顧客IDまたは国コードを使用して請求書IDをソートするためにsortに個別のコードを提供する必要がある.
Java 8までは、メソッドを他のメソッドに渡すことはできません.しかしながら、java 8は、他の方法の引き継ぎに方法を渡す機能を提供する.これを動作パラメータ化と呼ぶ.
compareUsingCustomerIdを使用してsortの動作をパラメータ化できます.動作パラメータ化は、後でより詳細に説明します.
メザーとランダを一級公民とする
Javaプログラムで操作できる値を考えてみましょう.1つ目はintフォーマット、doubleフォーマットなどのデフォルト値です.第二に、オブジェクトも値です.その後、関数はこれらの値を変更できます.このように関数で値を変えることができるものを1級と言います.Javaプログラミング言語の異なる構造体(メソッド、クラスなど)は、値を表す構造に役立つ可能性があります.しかし、すべての構造体を自由に伝達することはできない.このように伝えられない構造体は2級である.つまり、方法や等級などは二級公民です.これら自体は無価です.
JAva 8は、2級市民を1級市民に変える機能を追加した.
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file){
return file.isHidden();
}
});
Java 8では、上記のコードを1行に変換できます.File[] hiddenFiles = new File(".").listFiles(File::isHidden);
使用できるようになりました:(このメソッドを値として使用することを示します)listFilesにメソッドを渡します.Java 8では、メソッドを1級値と見なすだけでなく、ramda(または匿名関数を含む)関数も値と見なす.定義するたびに1、2回しか使用しない方法は面倒です.Java 8では,匿名関数やramdaという新しい概念を用いてこの問題を解決する.
Appleクラスのリストにすべてのグリーンアップルを返す方法(isGreenApple)と、特定重量以上のアップルをフィルタリングする方法(isHeavyApple)があるとします.
filterApples(inventory, (Apple a) -> GREEN.equals(a.getColor());
filterApples(inventory, (Apple a) -> a.getWeight() > 150);
ランダを利用して上記のように簡潔にコードを書くことができます.すなわち,1回のみ使用する方法を個別に定義する必要はない.エラーメソッド
JAva 8は、インタフェースを簡単に変更できるデバッグ方法をサポートしています.デフォルトの方法は、特定のプログラムを実装するのに役立つ機能ではなく、将来のプログラムに変更しやすい環境を提供する機能です.
インタフェースに新しいメソッドを追加する場合、インタフェースのインプリメンテーションボディは、新しい追加メソッドを実装する必要があります.実際には,言語設計者は集合インタフェースのすべてのコードを実現する責任を負うことはできない.したがってjava 8は、実装クラスで実装する必要のない方法をインタフェースに追加する機能を提供する.デフォルトの方法では、既存のコードに触れずに元のインタフェース設計を自由に拡張できます.defaultという新しいキーワードをサポートします.
整理する
今からあの有名な「モダンジャワアクション映画」を読み始めました!盲目的な流れがシンプルなので使いましょう!!それだけでなく、Stream APIの誕生背景も知り、Javaの歴史も知り、とても面白かったです.次の章でもJavaの進化(?)がわかります好奇心がある.そして确かにブログを作って、勉强したことを私のものにしたような気がします.
Reference
この問題について([モダンジャワ動作]ch.1), 我々は、より多くの情報をここで見つけました https://velog.io/@lejins95/모던-자바-인-액션-ch.1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol