1. Java 8 の革新: 関数型プログラミング

Java 8 のリリースにより、この言語は関数型プログラミングの強力なサポートを獲得しました。待望の関数型プログラミングのサポートを獲得したとさえ言えるでしょう。コードは読みにくくなりましたが、コーディングは速くなりました 🙂

Java で関数型プログラミングを学習する前に、次の 3 つのことをよく理解しておくことをお勧めします。

  1. OOP、継承、インターフェイス ( Java Core クエストのレベル 1 ~ 2 )。
  2. インターフェイス内のデフォルトのメソッド実装
  3. 内部クラス匿名クラス

幸いなことに、Java で関数型プログラミングの機能の多くを使用するために、これらすべてを知る必要はないということです。悪いニュースは、匿名の内部クラスについて知らなければ、すべてがどのように配置され、すべてがどのように機能するかを正確に理解するのが難しいことです。

今後のレッスンでは、その仕組みを深く理解していなくても、Java の関数型プログラミング機能を使用することがいかに簡単で簡単であるかに焦点を当てます。

Java の関数型プログラミングのニュアンスをすべて理解するには数か月かかります。このようなコードの読み方は数時間で習得できます。したがって、小規模から始めることをお勧めします。たとえそれが I/O ストリームであっても。


2. I/O ストリーム: ストリーム パイプライン

昔、I/O ストリーム 、 、 などについて学んだことを覚えてInputStreamOutputStreamますReaderWriter?

などのデータ ソースからデータを読み取るストリーム クラスFileInputSteamと、 や などの他のストリームからデータを読み取る中間データ ストリームがありましInputStreamReaderBufferedReader

これらのストリームはデータ処理パイプラインに編成できます。たとえば、次のようになります。

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

コードの最初の数行では、Streamオブジェクトのチェーンを構築しているだけであることに注意することが重要です。データはまだパイプラインを通過していません。

しかし、メソッドを呼び出すとすぐにbuff.readLine()、次のことが起こります。

  1. オブジェクトがオブジェクトのメソッドをBufferedReader呼び出すread()InputStreamReader
  2. オブジェクトがオブジェクトのメソッドをInputStreamReader呼び出すread()FileInputStream
  3. オブジェクトがファイルからのFileInputStreamデータの読み取りを開始します

つまり、read()や のようなメソッドの呼び出しを開始するまで、ストリーム パイプラインに沿ったデータの移動はありませんreadLine()。ストリーム パイプラインを構築するだけでは、そこにデータが送信されません。ストリーム自体にはデータは保存されません。彼らは他人からの情報を読むだけです。

コレクションとストリーム

Java 8 以降、ストリームを取得してコレクション (コレクションからだけではなく) からデータを読み取ることができるようになりました。しかし、これが最も興味深いことではありません。実際、データ ストリームの複雑なチェーンを簡単かつシンプルに構築できるようになりました。そうすることで、以前は 5 ~ 10 行かかったコードが 1 ~ 2 行で記述できるようになりました。

文字列のリストから最長の文字列を検索する例:

最長の文字列を見つける
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3.Streamインターフェース

Java 8 のストリームに対する拡張サポートは、インターフェースを使用して実装されますStream<T>。ここで、Tはストリームで渡されるデータのタイプを示すタイプ・パラメーターです。言い換えれば、ストリームは、それが渡すデータのタイプから完全に独立しています。

コレクションからストリーム オブジェクトを取得するには、そのstream()メソッドを呼び出すだけです。コードはおおよそ次のようになります。

Stream<Type> name = collection.stream();
コレクションからストリームを取得する

この場合、コレクションはストリームのデータ ソースとみなされ、Stream<Type>オブジェクトはコレクションからデータ ストリームの形式でデータを取得するツールになります。

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

ちなみに、ストリームはコレクションだけでなく配列からも取得できます。これを行うには、メソッドを使用する必要があります。例えば:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
配列からストリームを取得する

この場合、配列はというストリームのデータ ソースとみなされますname

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

Stream<Type>オブジェクトの作成時にデータは移動されません。ストリーム パイプラインの構築を開始するために、ストリーム オブジェクトを取得しただけです。