1概要

この記事では、Java 8が追加した主要機能の1つであるStreamsについて簡単に説明します。

簡単な例を使用して、ストリームとは何かについて説明し、作成と基本的なストリーム操作を紹介します。


2ストリームAPI

Java 8の主な新機能の1つは、ストリーム機能の導入です –


java.util .stream


– 要素のシーケンスを処理するためのクラスが含まれています。

中心的なAPIクラスは__https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.htmlです。[Stream <T>]。既存のデータプロバイダソースを使用して作成されています。


2.1. ストリーム作成

ストリームはさまざまな要素ソースから作成できます。

stream()

および

of()

メソッドを使用したコレクションまたは配列

String[]arr = new String[]{"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
stream = Stream.of("a", "b", "c");


stream()

defaultメソッドが

Collection

インタフェースに追加され、任意のコレクションを要素のソースとして使用して

Stream <T>

を作成することができます


_:

_

Stream<String> stream = list.stream();


2.2. Streams

によるマルチスレッド

Stream APIは、ストリームの要素に対して並列モードで操作を実行する

parallelStream()

メソッドを提供することで、マルチスレッド化を簡素化します。

以下のコードでは、ストリームのすべての要素についてメソッド

doWork()

を並列に実行できます。

list.parallelStream().forEach(element -> doWork(element));

次のセクションでは、基本的なStream APIオペレーションのいくつかを紹介します。


3ストリーム操作

ストリームに対して実行できる便利な操作はたくさんあります。

それらは

中間操作

(return

Stream <T>

)と

端末操作

(確定型の結果を返す)に分けられます。中間操作は連鎖を可能にします。

ストリームに対する操作がソースを変更しないことも注目に値します。

これが簡単な例です。

long count = list.stream().distinct().count();

そのため、

distinct()

メソッドは、前のストリームの固有の要素からなる新しいストリームを作成する中間操作を表します。そして

count()

メソッドは端末操作

__、

__で、ストリームのサイズを返します。


3.1. 繰り返し

Stream APIは、

for、for-each

、および

while

ループを置き換えるのに役立ちます。操作のロジックに集中することはできますが、要素のシーケンスに対する反復には集中できません。例えば:

for (String string : list) {
    if (string.contains("a")) {
        return true;
    }
}

このコードは、1行のJava 8コードで変更できます。

boolean isExist = list.stream().anyMatch(element -> element.contains("a"));


3.2. フィルタリング


filter()

メソッドを使用すると、述語を満たす要素のストリームを選択できます。

たとえば、次のリストを考えてください。

ArrayList<String> list = new ArrayList<>();
list.add("One");
list.add("OneAndOnly");
list.add("Derek");
list.add("Change");
list.add("factory");
list.add("justBefore");
list.add("Italy");
list.add("Italy");
list.add("Thursday");
list.add("");
list.add("");

次のコードは、

List <String>



Stream <String>

を作成し、

char“ d”

を含むこのストリームのすべての要素を検索し、フィルタ処理された要素のみを含む新しいストリームを作成します。

Stream<String> stream = list.stream().filter(element -> element.contains("d"));


3.3. マッピング

特別な関数を適用して

Stream

の要素を変換し、これらの新しい要素を

Stream

にまとめるには、

map()

メソッドを使用します。

List<String> uris = new ArrayList<>();
uris.add("C:\\My.txt");
Stream<Path> stream = uris.stream().map(uri -> Paths.get(uri));

したがって、上記のコードでは、

Stream

のすべての要素に特定のラムダ式を適用することによって、

Stream <String>



Stream <Path>

に変換しています。

すべての要素に独自の要素のシーケンスが含まれているストリームがあり、これらの内部要素のストリームを作成する場合は、

flatMap()

メソッドを使用する必要があります。

List<Detail> details = new ArrayList<>();
details.add(new Detail());
Stream<String> stream
  = details.stream().flatMap(detail -> detail.getParts().stream());

この例では、

Detail型の要素のリストがあります。

Detail

クラスには

List <String>メソッドである

PARTSフィールドが含まれています。

flatMap()メソッドを使用すると、

PARTS

フィールドのすべての要素は抽出され、新しい結果ストリームに追加されます。その後、最初の

Stream <Detail>

は失われます


_.

_


3.4. マッチング

Stream APIは、述部に従ってシーケンスの要素を検証するための便利な一連の手段を提供します。これを実行するには、__anyMatch()、allMatch()、noneMatch()のいずれかの方法を使用できます。これらはブール値を返す端末操作です。

boolean isValid = list.stream().anyMatch(element -> element.contains("h"));//true
boolean isValidOne = list.stream().allMatch(element -> element.contains("h"));//false
boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h"));//false


3.5. 削減

Stream APIでは、

Stream

型の

reduce()

メソッドを使用して、指定した関数に従って要素のシーケンスを特定の値に減らすことができます。このメソッドは、2つのパラメータを取ります。最初の値は開始値、2番目の値はアキュムレータ関数です。


List <Integer>

があり、これらすべての要素と初期の

Integer

(この例では23)の合計が欲しいとします。したがって、次のコードを実行すると結果は26(23 1 1 1)になります。

List<Integer> integers = Arrays.asList(1, 1, 1);
Integer reduced = integers.stream().reduce(23, (a, b) -> a + b);


3.6. 収集中

この処理は、

Stream.

型の

collect()メソッドでも提供できます。この操作は、ストリームを

Collection

または

Map

に変換し、単一の文字列形式でストリームを表す場合に非常に便利です。ほとんどすべての典型的な収集操作のための解決策を提供するユーティリティクラス

Collectors

。些細な作業ではない一部の作業では、カスタム

Collector__を作成できます。

List<String> resultList
  = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());

このコードでは、端末の

collect()

操作を使用して、

Stream <String>



List <String> .

に減らしています。


4結論

この記事では、Javaストリームについて簡単に触れました。間違いなく最も興味深いJava 8の機能の1つです。

Streamsの使用に関するもっと高度な例があります。この記事の目的は、この機能を使って始められることについて、そして調査およびさらなる学習の出発点として、素早く実用的な紹介を提供することだけです。

記事に付随するソースコードは入手可能です

over on
GitHub。