初心者向けのJavaストリーム:Javaでのストリームの使用の概要

初心者向けのJavaストリーム:Javaでのストリームの使用の概要

Java 8ストリームを使用すると、開発者は、事前定義された一連の操作を使用して、大規模なコレクションから正確なデータを抽出できます。





Java 8のリリース前は、Javaで「ストリーム」という用語を使用すると、自動的にI / Oに関連付けられていました。ただし、Java 8では、一般に「ストリームパイプライン」と呼ばれるものにチェーンされた一連の計算ステップと呼ばれるストリームが導入されました。





この記事では、Java 8ストリームを紹介し、それらがプロジェクトでどのように役立つかを示します。





ストリームとは何ですか?

ストリームは、ソースを取得し、特定のデータを抽出するための一連の操作を実行し、そのデータをアプリケーションに提供して使用するJavaインターフェースです。基本的に、一般化されたデータのコレクションから特殊なデータを抽出できます。

ストリームのしくみ

ストリームパイプラインは常にソースから始まります。ソースのタイプは、処理しているデータのタイプによって異なりますが、最も一般的な2つは、配列とコレクションです。



コレクションを初期ストリームに変換するには、を追加する必要があります ストリーム() ソースへの機能。これにより、ソースがストリームパイプラインに配置され、そこでいくつかの異なる中間操作( フィルター()選別() )操作できます。

必要なすべての中間操作が実行された後、端末操作を導入できます( forEach() )、ソースから以前に抽出されたデータを生成します。





ストリームのない生活

Java 8は2014年にリリースされましたが、それ以前は、Java開発者は一般的なデータのコレクションから特殊なデータを抽出する必要がありました。

インターネットはどこから来たのですか

乱数と組み合わせて一意の文字列値を形成するランダム文字のリストがあるが、文字Cで始まる値のみが必要であり、結果を昇順で並べたいとします。これは、ストリームなしでそのデータを抽出する方法です。





関連している: Javaでの文字列の使用について知っておくべきこと

ストリームを使用しない値のフィルタリングと並べ替えの例


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'C13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'C16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//declare the array list will store needed values
List requiredValues = new ArrayList();
//extracting the required values and storing them in reqquiredValues
randomValues.forEach(value -> {
if(value.startsWith('C')) {
requiredValues.add(value);
}
});
//sort the requiredValues in ascending order
requiredValues.sort((String value1, String value2) -> value1.compareTo(value2));
//print each value to the console
requiredValues.forEach((String value) -> System.out.println(value));
}
}

また、ストリームを使用している場合でも、他の抽出方法を使用している場合でも、配列リストを宣言して初期化する必要があります。ストリームを使用している場合に行う必要がないのは、必要な値を保持するための新しい変数を宣言することでも、上記の例で他の5行以上のコードを作成することでもありません。

関連している: Javaで配列の操作を作成および実行する方法

上記のコードは、コンソールに次の出力を生成します。


C11
C12
C13
C14
C15
C16

ストリームのある生活

プログラミングでは、効率は大幅に少ないコードで同じ結果を生成することを意味します。これはまさに、ストリームパイプラインがプログラマーのために行うことです。では、次に誰かが尋ねたとき、プロジェクトでストリームを使用することが重要なのはなぜですか?簡単に言えば、ストリームは効率的なプログラミングをサポートします。

上記の例を続けると、これがストリームの導入によってプログラム全体がどのように変換されるかを示しています。

ストリームの例を使用した値のフィルタリングと並べ替え


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'C13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'C16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

上記のコードは、ストリームインターフェイスがいかに強力であるかを示しています。ランダムな配列値のリストを取得し、を使用してストリームに変換します。 ストリーム() 関数。次に、ストリームは、必要な値(で始まるすべての値)を含む配列リストに縮小されます。 NS )、を使用して フィルター() 関数。

上記の例でわかるように、 NS 値は配列リストにランダムに配置されます。パイプラインのこの時点でストリームを印刷する場合、値 C15 最初に印刷されます。したがって、 選別() 新しい配列を昇順で再配置する関数がストリームパイプラインに導入されました。

ストリームパイプラインの最後の機能は forEach() 関数。これは、ストリームパイプラインを停止するために使用される端末関数であり、コンソールで次の結果を生成します。


C11
C12
C13
C14
C15
C16

ストリーム中間操作

ストリームパイプラインで使用できる中間操作の広範なリストがあります。

ストリームパイプラインは常に単一のソースと ストリーム() 機能し、常に単一の端末操作で終了します(ただし、選択できるものはいくつかあります)。ただし、これら2つのセクションの間に、使用できる6つの中間操作のリストがあります。

上記の例では、これらの中間操作のうち2つだけが使用されています--- フィルター()選別() 。選択する中間操作は、実行するタスクによって異なります。

上記の配列リストでCで始まる値のいずれかが小文字であり、それらに対して同じ中間操作を実行した場合、次の結果が得られます。

小文字の値に対するフィルターおよびソート操作の実行例


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'c13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'c16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

上記のコードは、コンソールに次の値を生成します。


C11
C12
C14
C15

上記の出力の唯一の問題は、すべてを正確に表していないことです。 NS 配列リストの値。この小さなエラーを修正する良い方法は、ストリームパイプラインに別の中間操作を導入することです。この操作は、 地図() 関数。

Map関数の例の使用


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List randomValues = Arrays.asList(
'E11', 'D12', 'A13', 'F14', 'C15', 'A16',
'B11', 'B12', 'c13', 'B14', 'B15', 'B16',
'F12', 'E13', 'C11', 'C14', 'A15', 'c16',
'F11', 'C12', 'D13', 'E14', 'D15', 'D16'
);
//transforms all lower case characters to upper case,
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().map(String::toUpperCase).filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

NS 地図() 関数は、オブジェクトをある状態から別の状態に変換します。上記の例では、配列リスト内のすべての小文字を大文字に変換します。

を配置する 地図() 直前の機能 フィルター() 関数はで始まるすべての値を取得します NS 配列リストから。

上記のコードは、コンソールに次の結果を生成し、すべての NS 配列リストの値。


C11
C12
C13
C14
C15
C16

アプリケーションで使用できる他の3つの中間操作は次のとおりです。

  • ピーク()
  • limit()
  • スキップ()

Java8ストリームは効率的なコードの作成を容易にします

Java 8ストリームを使用すると、1行のコードで大規模なソースから特定の関連データを抽出できます。イニシャルを含める限り ストリーム() 関数とターミナルオペレーターを使用すると、目的に合った出力を提供する中間操作を任意に組み合わせて使用​​できます。

電話で削除された写真を回復する方法

に含まれるコード行について疑問がある場合 フィルター() 関数;これは「ラムダ式」として知られています。ラムダ式はJava8で導入されたもう1つの機能であり、役立つと思われるナゲットがたくさんあります。

共有 共有 つぶやき Eメール Java8ラムダの簡単な紹介

Javaプログラマーであり、Java 8ラムダについて詳しく知りたい場合は、この記事でラムダの構文と使用法について詳しく見ていきます。

次を読む
関連トピック
  • プログラミング
  • Java
  • コーディングチュートリアル
著者について カデイシャキーン(21の記事が公開されました)

Kadeisha Keanは、フルスタックソフトウェア開発者およびテクニカル/テクノロジーライターです。彼女は、最も複雑な技術的概念のいくつかを単純化する明確な能力を持っています。技術初心者なら誰でも簡単に理解できる素材を作る。彼女は、執筆、興味深いソフトウェアの開発、そして(ドキュメンタリーを通じて)世界中を旅することに情熱を注いでいます。

KadeishaKeanのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください