コード例を含むJava8Streamsチュートリアル
このブログ投稿では、Java 8 Streamsの機能について説明し、さまざまなコード例を提供します。
Java Streamsは関数型プログラミングをJavaにもたらし、Java 8以降でサポートされているため、古いバージョンのJavaを使用している場合は、JavaStreamsを使用するためにJava8にアップグレードする必要があります。
Javaストリームを使用する理由
ストリームの利点のいくつか:
- ストリームを使用すると、より効率的なJavaプログラマーになります(ほんの数行のコードで、ストリームを使用して実際にかなり多くのことを達成できることがわかります)。
- 使い捨て関数の一種であるラムダ式を多用します。
- ParallelStreamsを使用すると、大規模なデータセットのマルチスレッド操作を非常に簡単に実行できます。
ほとんどの場合、ストリームパイプラインは
で構成されます- ソース (データが流出する場所)
- その後に0個以上の中間操作が続く
- および1つの端末操作
ソースは要素のストリームをストリーミングします。
その要素のストリームは、フィルタリング、並べ替え、マッピング、または各要素に適用される他のさまざまな一連の操作を行うことができます。
最後に、収集または削減するか、その他の端末操作を行うことができますが、実行される端末操作は1つだけです。
ストリームソース コレクション、リスト、セット、int、longs、double、stringsなどの配列から取得できます。
ストリーム操作 中間または最終のいずれかです:
- 中間操作 フィルタ、マップ、並べ替えなどはストリームを返すため、複数の中間操作を連鎖させることができます。
- 端末操作 ストリームを受信すると、voidを返すか、削減などの非ストリーム結果を返すことができます。アイテムをリストに減らします。
- ゼロ以上の中間操作が許可されます。
- 注文が重要です。大規模なデータセットの場合:最初にフィルタリング 次に、並べ替えまたはマップします。
- 非常に大きなデータセットの場合、ParallelStreamを使用して複数のスレッドを有効にします。
中間操作には次のものがあります。
- anyMatch()
- distinct()
- filter()
- findFirst()
- flatmap()
- map()
- skip()
- sorted()
1つの端末操作のみが許可されます。
- forEachは、各要素に同じ関数を適用します。たとえば、各要素を印刷します。
- collectは、すべての要素をコレクション、リスト、または配列に保存します。
- 他のすべてのオプションは、ストリームを単一の要約要素に減らします。
リデュース関数の例は次のとおりです。
- count()
- max()
- min()
- reduce()
JavaStreamsのコード例
次に、コード例で上記の概念を見てみましょう。
最初の例は単なる整数ストリームです。 IntStream
を使用して整数ストリームを作成します クラスとその範囲関数は、整数の範囲を提供します。
forEach
私たちのターミナルオペレーションです。アイテムごとに、印刷するだけです。
import java.io.IOException;
import java.util.stream.IntStream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream
.range(1, 10)
.forEach(System.out::print);
System.out.println();
}
}
出力:
123456789
2番目の例では整数ストリームを使用していますが、skip()
を追加しました ここでは、この場合、ストリームの最初の5つの要素をスキップします。
これは要素6から9のみを印刷します。また、単純なラムダ式を使用してアイテムを印刷しています
import java.io.IOException;
import java.util.stream.IntStream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
IntStream
.range(1, 10)
.skip(5)
.forEach(x -> System.out.println(x));
System.out.println();
}
}
出力:
6
7
8
9
3番目の例では、ここでもIntStream
を使用します ただし、オブジェクトのストリームを作成するには、それをprintln()
内に配置します。 印刷行のパラメータとしてのステートメント。
印刷するのは、範囲1から5までの合計です。つまり、1 2 3&4は、これらの数値の合計のみを印刷します。
import java.io.IOException;
import java.util.stream.IntStream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
System.out.println(
IntStream
.range(1, 5)
.sum());
System.out.println();
}
}
出力:
10
Stream.of
次の例では、Stream.of
を使用します 関数。整数、浮動小数点値、文字列、さらにはオブジェクトをストリーミングできるため、非常に便利です。
この例では、アルファベット順で並べ替えてから、findFirst()
を使用して最初のアイテムを検索します。 関数。次に、リストの最初の項目を印刷します。
import java.io.IOException;
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream.of("Ava", "Aneri", "Alberto")
.sorted()
.findFirst()
.ifPresent(System.out::println);
}
}
出力
Alberto
配列からのストリーム、並べ替え、フィルタリング、印刷
次の例では、配列からストリーミングします。次に、並べ替え、フィルタリング、印刷を行います。
ここでは、s
で始まるアイテムのみを除外します 。
X
を取り込むラムダ式を使用します これはそれぞれの名前であり、文字s
で始まる名前をチェックします そしてそれはそれらを渡します。
次に、それらを並べ替えてから、その並べ替えに合格したアイテムごとに印刷します。
import java.io.IOException;
import java.util.Arrays;
public class JavaStreams {
public static void main(String[] args) throws IOException {
String[] names = {"Al", "Ankit", "Kushal", "Brent", "Sarika", "amanda", "Hans", "Shivika", "Sarah"};
Arrays.stream(names)
.filter(x -> x.startsWith("S"))
.sorted()
.forEach(System.out::println);
}
}
出力:
Sarah
Sarika
Shivika
次に、int配列の2乗の平均をとる方法を見てみましょう。
ここでは、Arrays.stream()
を使用します 整数をストリーミングする関数を使用してから、map()
を使用します 各アイテムの各整数をその正方形にマップします。
import java.util.Arrays;
public class JavaStreams {
public static void main(String[] args) {
Arrays.stream(new int[] {2, 4, 6, 8, 10})
.map(x -> x * x)
.average()
.ifPresent(System.out::println);
}
}
出力:
44.0
整数ではなくdoubleを出力することに注意してください。
リストからのストリーミング、フィルタリング、印刷
この例では、リストからストリーミングし、それらのアイテムをフィルタリングしてから印刷します。
map()
内にあることに注意してください 関数の場合、すべての名前を小文字に変換します。
import java.util.Arrays;
import java.util.List;
public class JavaStreams {
public static void main(String[] args) {
List<String> people = Arrays.asList("Al", "Ankit", "Brent", "Sarika", "amanda", "Hans", "Shivika", "Sarah");
people
.stream()
.map(String::toLowerCase)
.filter(x -> x.startsWith("a"))
.forEach(System.out::println);
}
}
出力:
al
ankit
amanda
a
で始まる3つの名前があることがわかります そしてそれらはすべて小文字です。
テキストファイルから行をストリーミングし、並べ替え、フィルタリング、印刷
次の例では、テキストファイルから行をストリーミングします。並べ替え、フィルタリング、印刷を行います。
bands.txt
というファイルがあるとしましょう。 以下に内容を示します:
Rolling Stones
Lady Gaga
Jackson Browne
Maroon 5
Arijit Singh
Elton John
John Mayer
CCR
Eagles
Pink
Aerosmith
Adele
Taylor Swift
Files.lines()
を使用します ファイルの各行に文字列のストリームを提供するストリームを作成します。
ストリームを取得したら、それらを並べ替え、13文字を超えるアイテムを除外して、残っているアイテムを印刷します。
最後に、ファイルを閉じてbands.close
を実行する必要があります 。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream<String> bands = Files.lines(Paths.get("bands.txt"));
bands
.sorted()
.filter(x -> x.length() > 13)
.forEach(System.out::println);
bands.close();
}
}
出力:
Jackson Browne
Rolling Stones
13文字を超える2つのバンドがあります。
テキストファイルから行をストリーミングし、リストに保存
この例では、上記と同じテキストファイルを使用します。
jit
という文字を含むアイテムを除外します 、x.contains()
を使用 これは単なる文字列関数です。
.collect()
を使用する jit
の文字ですべてを追加します リストに。
リストができたら、forEach
を使用できます アイテムを印刷する演算子。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
public class JavaStreams {
public static void main(String[] args) throws IOException {
List<String> bands2 = Files.lines(Paths.get("bands.txt"))
.filter(x -> x.contains("jit"))
.collect(Collectors.toList());
bands2.forEach(x -> System.out.println(x));
}
}
出力:
Arijit Singh
CSVファイルから行をストリーミングしてカウント
この例では、CSVファイルから行をストリーミングし、適切な行をカウントします。
data.txt
というファイルがあるとします。 次の内容で:
A,12,3.7
B,17,2.8
C,14,1.9
D,23,2.7
E
F,18,3.4
ここでは、行Eにデータがないため、そのデータをストリームから除外します。
次のコードでは、各行を読み取り、コンマで配列に分割して、各行がアイテムの配列になるようにする必要があります。
次に、フィルターを適用して、3つのアイテムがない行をフィルターで除外します。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) throws IOException {
Stream<String> rows1 = Files.lines(Paths.get("data.txt"));
int rowCount = (int)rows1
.map(x -> x.split(","))
.filter(x -> x.length == 3)
.count();
System.out.println(rowCount + " rows.");
rows1.close();
}
}
出力:
5 rows
この例は、リダクションの使用方法を示しています。合計に減らします。ここでは、Stream.of()
を使用したダブルストリームがあります 関数。 3つの異なる引数で3つのdoubleを定義し、reduce関数を使用します。
import java.util.stream.Stream;
public class JavaStreams {
public static void main(String[] args) {
double total = Stream.of(7.3, 1.5, 4.8)
.reduce(0.0, (Double a, Double b) -> a + b);
System.out.println("Total = " + total);
}
}
出力:
13.600000000000001
-
例を含むJava文字charCount()
Character.charCount()メソッドは、指定された文字(Unicodeコードポイント)を表すために必要なchar値の数を決定します。指定された文字が0x10000以上の場合、メソッドは2を返します。それ以外の場合、メソッドは1を返します。 例 例を見てみましょう- import java.lang.*; public class Demo { public static void main(String[] args) { // create and assign values to int codepoint
-
例を使用したJavaArrayListメソッド
この投稿では、最も一般的なJavaArrayListメソッドと各メソッドのコード例について説明します。 ArrayList classはサイズ変更可能な配列です。通常、ArrayListを使用します リストのサイズが事前にわからない場合。 ArrayList クラスはjava.utilにあります パッケージ。 ArrayListを作成する方法 ArrayListを作成してアイテムを追加するには、ArrayListをインスタンス化します。 Stringなどの指定されたタイプのオブジェクト またはInteger 。 add()に注意してください メソッドは、ArrayListの次の位置に項