Java 8ストリームの紹介
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。