序文
ヘッドのみが強くなることができます。
テキストは、私のGitHubリポジトリに含まれている、歓迎スター:https://github.com/ZhongFuCheng3y/3y
ラムダ式の使用を説明するために、前の「最近ラムダ式の基本を学んだ、」私は、学生がハ〜を読みに行くことができます見ていません
仕事でより多く使用されるシーンラムダ式:私が知りたいの学生がたくさんあると考えていますか?使用し、ラムダとの側面を取るストリームの流れをよりになります
ほとんどの人は、最初の(コードはJavaのように記述されていないかのように見えます。)ビットを読んでいないだろう、コードストリームの流れを見て、私はこの記事がドアにあなたを取ることを願っています
まず、経験ストリームの流れ
:自己学習の誰もが、ほとんどはプログラム持っていることを学ぶだろう算出从数组元素的和
、我々は書く方法がありますか?一般に、これは次のようになります。
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum = 0;
for (int i : nums) {
sum += i;
}
System.out.println("结果为:" + sum);
}
私たちは、ストリーム・フローを使用している場合、それはすることができ:
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum2 = IntStream.of(nums).sum();
System.out.println("结果为:" + sum2);
}
符号量明らかに、ストリーム方式のストリームがより少ないであろう。
:私は、ストリームフロープログラミングはこれです理解し、私はあなたの曲をあげる、いくつかのシーンは、頻繁に操作(合計/デエンファシス/フィルタ....など)で使用される、APIはあなたに良いパッケージ化された、あなたが書いていませんAPIはうまく提供します。
1.1同時サポート
戻る私たちの最も原始的なコードに:
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum = 0;
for (int i : nums) {
sum += i;
}
System.out.println("结果为:" + sum);
}
私たちが望む場合はfor
サポート同時の内部ループを、その後、明らかではない非常に良い書き込みます。しかし、ストリームフローの方法を使用するには、メソッドを呼び出すと、同時サポートすることができます(並列に):
public static void main(String[] args) {
int[] nums = { 1, 2, 3 };
int sum2 = IntStream.of(nums).parallel().sum();
System.out.println("结果为:" + sum2);
}
長所:APIの音は確かにあなたがそれを自分で書いたコードの量よりも少ないです。
短所:非常に便利ではないデバッグ
なぜ、私の意見では、ストリーム・フローを使用すると、二つ以上の理由であります:
- 便利同時
- (直接APIと呼ばれる)以下のコード
第二に、どのようにストリームの流れを使用するには?
ストリームフローは3つの段階に分かれて使用します。
- ストリームフローの作成
- 中間操作ストリームstreamオブジェクトを実行することによって
- 最終的な作用は、結果が得られました
2.1は、ストリームを作成します
私たちは、最も一般的に使用されるストリームで作成コレクションからの流れを作成します
/**
* 返回的都是流对象
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// 从集合创建
Stream<String> stream = list.stream();
Stream<String> stream1 = list.parallelStream();
// 从数组创建
IntStream stream2 = Arrays.stream(new int[]{2, 3, 5});
// 创建数字流
IntStream intStream = IntStream.of(1, 2, 3);
// 使用random创建
IntStream limit = new Random().ints().limit(10);
}
2.2中間操作を行います
操作の途中を理解するには?意味はこれです:私たちは、ストリームを作成することができた以上、我々は上にあるストリームの操作、ストリーム操作が完了またはストリームを返す、我々は中間操作としてこの操作を呼び出すために戻ります。
たとえば、私たちは今、文字列を持ってmy name is 007
次のように、:
String str = "my name is 007";
Stream.of(str.split(" ")).filter(s -> s.length() > 2)
.map(s -> s.length()).forEach(System.out::println);
分解:
1、ストリームオブジェクトは、文字列の配列を作成します。
Stream<String> split = Stream.of(str.split(" "));
図2に示すように、ストリームオブジェクトAPI中間演算(フィルタ)、または戻りストリームオブジェクトによって実行されます。
Stream<String> filterStream = split.filter(s -> s.length() > 2);
図3に示すように、その後、ストリームオブジェクトにより中間演算(MAP)を行う、ストリームオブジェクトが返されます。
Stream<Integer> integerStream = filterStream.map(s -> s.length());
操作の途中ので返されるストリームオブジェクトを、私たちは可能な呼び出しをチェーン。
注意:ストリーム上の操作はすぐに実行されません、ユーザーが本当に必要な結果だけが(行われることになるまで待つ遅延評価を)。
例えば、peek()
中間の操作は、ストリームストリームオブジェクトを返す限り、それが行われ、最終的な操作ではないとして、ストリームが実装されません。
String str = "my name is 007";
Stream.of(str.split(" ")).peek(System.out::println); // 不会有信息打印
2.3の最終処理を行なっ
最終的な操作は、もはや、ストリームオブジェクトが返される操作の最終的なメソッドを呼び出し、ストリームが実行されません。あるいは、上記の例では、例えば:
String str = "my name is 007";
Stream.of(str.split(" ")).peek(System.out::println).forEach(System.out::println)
中間動作および最終操作は、印刷を実行しているので、それは2枚の印刷が表示され、今回は、最終的な動作を接合するので、このストリームのフローが実行されます。
操作の途中、どのように、最終的な操作を区別するためのように、私たちはしなければならない値を返す行に見ること。中間操作は、オブジェクトインスタンスを返すストリーム操作は、オブジェクトの最終的なインスタンスに戻りストリームではありません。
遂に
ストリームの流れに合わせてみんなでこの記事予備的理解、中間操作として、APIは私が書いていない最終の動作を説明するための(多くのオンラインチュートリアルがあります)
私は2つがあると思いストリームを使用する理由:
- JDKライブラリは、簡単な最適化を記述するためのコードを既存のAPIを提供します
- 便利な同時実行。我々は結論を思い出すことができますでマルチコアの場合は、使用することができます並列マルチコアの優位性を再生するためのストリームAPIを。シングルコアの場合は、私たち自身の書き込み
for
ストリームAPIよりもはるかに悪いパフォーマンスを
参考文献:
喜んで出力乾貨物の Javaテクノロジ公共数の:Java3y。パブリック数200件の以上のオリジナルの記事技術記事、大量のビデオ資源、美しいマインドマップは、注意が得ることができます!
私はポイント、記事がよく書かれていると思う賞賛を!