マスターストリームAPI以降


Java 8は2014年にリリースされました.そして、それを現在の開発者(例えばラムダ式、並行性API改善、機能的なインターフェースとバルクデータ処理への改善)によって必須として賞賛される新機能のヒープを持ってきました.それから多くの年が経っている間、Java 8はJavaの最も使用されたバージョンのままです.そして、2020年にプロの開発者の60 %以上が彼らのオフィス標準版としてJava 8を報告します.
Javaバージョンを主なアプリケーションとして報告する開発者の割合

結果として、あなたが仕事を変えるか、ちょうど出発しているならば、Java 8の熟達は今日の技術界で持っている重要な技術です.あなたが今ちょうどJavaバージョンを交換しているならば、あなたがパーティーに少し遅れているように感じるかもしれません、しかし、心配しないでください!Java 8の機能は、あなたが考えるよりもピックアップするのが簡単です、そして、今日、私は最も重要なJava 8アップデートの1つに精通しています.
今日、我々は行きます:
  • What is a Stream in Java 8?
  • Features of the Stream
  • Comparing Streams and Loops
  • Java 8 Stream API Pipeline: Intermediate and Terminal Operations

  • What should you learn next?
  • 経験を持ってJava 8上で脚を取得


    ゼロから再起動することなく、すべての強力なJava 8機能を手で、自分のペースで学ぶ.
    Java 8 for Experienced Developers: Lambdas, Stream API & Beyond

    Java 8のストリームは何ですか?


    すべての強力なOracleインターフェイスパッケージの要約の言葉では、ストリームは“順序と並列集約操作をサポートする要素のシーケンス”です.偉大な早口言葉ながら、それは最も消化性の定義ではない.翻訳を許可します.
    ストリームは、開発者が容易にオブジェクトまたはプリミティブのコレクションを操作できるようにするJava 8で追加された抽象層です.データを格納しないので、データ構造ではありませんむしろ、データソースから目的地までの変換媒体として機能します.
    ストリーム演算と呼ばれる集約演算は、ストリームの一部(またはすべて)を一度に変換するために使用できるストリームに特有の操作です.我々は、後でこれらの例を見ます.
    最後に、シーケンシャル対並列は実装する能力を意味するconcurrency ストリーム操作を完了するとき.操作は、1つのスレッドで一度に一つずつ適用できます.また、同時に操作を適用する複数のスレッド間で分割できます.
    ストリームは、データのソース間の中間ステップとして動作するので、パイプラインとして視覚化されることが多く、何らかの方法で変換し、新しい形式で下流に出力します.私たちは、このメタファーを再訪します.
    ストリームAPIを使用すると、伝統的なコーディングよりもコーディングの基本的に異なるスタイルが必要です- Javaでのほとんどのコーディングが命令型で書かれている間、開発者が何をするか、どのようにそれを完了するかを指示している間、ストリームAPIからの操作には、SQL .

    流れの特徴


    ストリームが何であるかを知っているので、ストリームを使うときに利用できるいくつかの性質を簡単に見てみましょう.
  • ソースコレクションまたは配列を使用して作成
  • グループを変換できますが、データを変更できません
  • 簡単に一度に全体のコレクションの操作を許可します
  • ストリームを宣言処理できる
  • データを格納したり、処理するデータを調整したりしないので、データ構造ではありません.
  • ラムダ式で調整可能
  • ストリームとループの比較


    ストリームはしばしばループと比較されます.ループと比較して、流れは混乱したループ構文の切断のためにインラインでよりきれいに見えます.ストリームは間違いなくその宣言的なスタイルのおかげで理解するのは簡単です.
    以下では、データコレクションを印刷するのと同じタスクを達成するJavaコードの2つのスナップを持っています.stream ストリームを使用するloop forループ.どのように異なるかを見てください!我々は、もう少し下でこれを壊します.
    ストリーム
    import java.util.stream.*;
    
    class StreamDemo {
    
        public static void main(String[] args)
        {
            Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9);
            stream.forEach(p -> System.out.println(p));
        }
    }
    
    ループ
    class ArrayTraverse {
        public static void main(String args[]) {
            int my_array[]={1,2,3,4,5,6,7,8,9};
            for(int i:my_array) {
                System.out.print(i+" ");
            }
        }
    }
    
    自動反復を使用するときに注意してくださいforEach() ストリーム操作では、回線を切断し、コードを読みやすくすることができます.
    forループでは、コードのほとんどは配列を印刷するのではなく反復を作成することに専念します.これは開発者のための余分な時間の多くを追加します.APIライブラリの反復処理は、反復処理を実行するため、制御フローのすべての小さなバイトを管理する代わりに、計算のロジックを明示的に表現できます.
    しかしながら、このスタイルを採用する欠点は、何年も命令的なスタイルを使用している業界のベテランにとって、移行が困難になることである.あなたがそれを拾うのに苦労している場合は、一人ではない!
    注意すべきもう一つの欠点は、ストリーム、特に並列ストリームは、forループよりかなりオーバーヘッドを要することです.オーバーヘッドがあなたのプログラムの懸念であるならば、これを考慮してください.

    ストリームの利点と欠点


    長所
  • コードの少ない視覚乱雑さ
  • イテレータを書く必要はありません
  • “どのように”を書くことができる“方法”、一目でわかる
  • ループに対して高速で実行する(あるいは並列動作を高速にする)
  • グレート大きなリスト
  • 短所
  • 大きなオーバーヘッドコスト
  • 小コレクションのオーバーキル
  • 伝統的な命令スタイルのコーディングに使用されている場合
  • 学習を続ける。


    ちょうどストリームで止まらないでください.Java 8ラムダ式、Java時刻、および対話型のコーディング例でより多くのようなより高度なJavaの概念を学びます.あなたのスキルレベルに合わせてHelloWorldとレッスンとチュートリアルにこんにちはバイバイを言う!
    Java 8 for Experienced Developers: Lambdas, Stream API & Beyond



    Java 8ストリームAPIパイプライン:中間および端末動作


    集約演算は2つのタイプになります中間と端末.各々のストリームは、ゼロまたはより中間の操作および1つの端末操作だけでなく、アレーまたはリストのような上流の上流のデータソースを有する.
    中間演算はストリームを入力として受け取り、完了後のストリームを返す.
    以前からの我々の比喩では、これらの活動は、流れの流れを中断することなく、水のようなデータが入って、出るパイプセグメントのようです.一方、ストリームを新しい方向にリダイレクトしたり、フォームを変更したりすることもありますが、まだ流れています.中間演算の一般的な例はfilter() , forEach() , and map() . 以下の話をしましょう.

    filter ()


    このメソッドは、ストリームを受け取り、渡された基準に基づいて一部を選択します.我々の比喩で.filter() パイプジャンクションかバルブのどちらかであって、流れの一部を別の方法で通過させる.
    例えば、下記の使用filter() 整数以上のストリームで、ストリームを10より大きい整数で返します.
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.*;
    
    class StreamDemo {
    
        public static void main(String[] args) {
    
            //Created a list of integers
            List<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(12);
            list.add(23);
            list.add(45);
            list.add(6);
    
            list.stream()                           // Created a stream from the list
                    .filter(num -> num > 10)        //filter operation to get only numbers greater than 10
                    .forEach(System.out::println);  // Printing each number in the list after filtering.
    
            //Again printing the elements of List to show that the original list is not modified.
            System.out.println("Original list is not modified");
            list.stream() 
                    .forEach(System.out::println);
        }
    }
    
    これは、元のストリームを変更しないことに注意することが重要です、データベースを検索するような静的データを使用して検索タスクに有効になります.

    map ()


    このメソッドはストリームと別のメソッドを入力として受け取り、ストリーム内の各要素にその関数を適用します.これらの結果は、それから下流に送られる新しい流れを収容するのに用いられます.
    例えば、下記の使用map() 名前のストリームでtoUpperCase 各名前へのメソッド.これは、それぞれの人の名前で資本を新しいストリームになります.これは1つのタイプのマップ操作です.その他MaptoInt() , ストリームを整数に変換し、flatMap() , すべてのストリーム要素を組み合わせます.
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.*;
    
    class StreamDemo {
    
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("Dave");
            list.add("Joe");
            list.add("Ryan");
            list.add("Iyan");
            list.add("Ray");
            // map() is used to convert each name to upper case.
            // Note: The map() method does not modify the original list.
            list.stream()
                    .map(name -> name.toUpperCase()) //map() takes an input of Function<T, R> type.
                    .forEach(System.out::println);   // forEach() takes an input of Consumer type.
    
        }
    }
    
    端末操作は、原始またはオブジェクトのようなストリーム以外の何かを返します.これは、多くの中間の操作が直列にされることができる間、1つの端末操作だけがありえることを意味する.
    我々の比喩では、これらの操作は、行の終わりとして視覚化されますストリームが入っているが、その流れは停止し、データを別の型として残す.このデータをストリーム形式に戻すことができますが、それは我々の端末操作からの入力と同じ流れでありません.
    端末操作の最も一般的な例はforEach() 関数.

    forehat ()


    このメソッドはストリームを入力としてストリームをとり、各要素の動作を完了し、そのアクションの結果を出力します.間の重要な違いforEach() and map() 前者はデータを非ストリーム形式で返し、端末を作る.
    また先の例を見てみましょう.出力は、個々の印刷された整数のグループであり、集められた整数のストリームではないことに注意してください.
    import java.util.stream.*;
    
    class StreamDemo {
    
        public static void main(String[] args)
        {
            Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9);
            stream.forEach(p -> System.out.println(p));
        }
    }
    

    次に何を学びますか。


    業界中の開発チームが明らかにした、Java 8はよく好まれ、それはここに滞在することです.あなたがJava 8をマスターするために旅に出ているならば、これは探索するために残されるとても多くの刺激的な特徴でちょうど始まりです.
    その旅にあなたを助けるために、我々は申し出に興奮しているJava 8 for Experienced Developers: Lambdas, Stream API & Beyond , コースベテランJava開発者Saurav Agargarwalのヒントとインタラクティブな例では、ラムダ式、ストリームの高度なストリームAPI、コレクションの管理への深いダイビングを増やすようなトピックでインタラクティブな例では、将来の並行性を完了し、より多くの.
    どこへ行こうとも、あなたのJava 8の旅を続ける幸運を祈ります!

    Javaについての続きを読む

  • 15 Java Interview Questions to Help you Prepare
  • Why Java is More Secure than Other Languages