Java Stream関数式プログラミング図文詳細解(二):パイプデータ処理

4876 ワード

一、Java Streamパイプデータ処理操作
この号の前に発表した「Java Stream関数式プログラミング?使ってもいいですが、判例図の詳細をお届けします」では、Java Streamの紹介や簡単な使い方をご紹介しました.この文書を開始する前に、Java Streamデータ処理手順図を紹介する必要があります.図は主に3つの部分に分かれています.
  • 配列、集合クラス、テキストファイルをパイプフロー(図中の青いブロックの部分、本号の前の記事で紹介した)
  • に変換
  • Java Streamパイプラインデータ処理操作(すなわち、下図の中間の破線内のデータ処理操作、本明細書の主な内容)
  • .
  • パイプフロー処理結果の集約、累積、カウント、集合クラスへの変換などの動作(図中の緑色ブロック部分)
  • .
    Java Streamの中間データ処理操作の入力はパイプラインフロー(Stream)であり、出力はパイプラインフロー(Stream)であることに注意してください.次は詳しく勉強しましょう.前の記事では、次のような例を示しました.
        List nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
        
        List list = nameStrs.stream()
                .filter(s -> s.startsWith("L"))
                .map(String::toUpperCase)
                .sorted()
                .collect(toList());
        System.out.println(list);

    この例では、まずstream()関数を使用して配列をパイプフローに変換し、次にパイプフローの要素をフィルタフィルタ()し、Lの先頭の要素のみを保持し、各要素を大文字(map(String::toUpperCase))に変換し、sorted()をソートし、最終的にListタイプに変換する機能を果たします.処理後の出力結果は、[LEMUR, LION]である.上記の例では、filter()、map()、sorted()が中間データ処理操作に属していますが、これらの関数の詳細な使い方を説明します.
    二、filterパイプデータフィルタ
    筆者の経験によれば、filter()はStreamAPIの最も有用な操作の一つであり、条件に合わない要素をフィルタリングすることができる.次のコードは、パイプ内のLで始まる文字列要素をフィルタします.処理が完了すると、パイプに残っている要素は[Lion,Lemur]です.
         Stream startsWithT = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
         .filter(s -> s.startsWith("L"));

    Lambda式を習ったことがない学生は、上のコードに戸惑うかもしれません.実は簡単です.lambda式は関数を表現するために使用され、矢印の左側はパラメータで、矢印の右側は関数体です.関数のパラメータタイプと戻り値タイプは、コンテキストに基づいて自動化された判断を行い、管理する必要はありません.上記のlambda式は関数として書かれています.
        public static boolean filterUpperL(String str){
            return str.startsWith("L");
        }
        
        //.filter(BootLaunchApplicationTests::filterUpperL)

    この構文がコードの可読性を低下させるというlambda式の使用を排斥する人も見たことがある.これはどういうことですか.もし専門誌に英語の専門名詞と引用が含まれていて、読者がちょうど英語ができないと読みたくないなら、これは文章の問題ではなく、読者の問題だと思います.またlamdba式は様々なプログラミング言語で広く使用され,符号化効率が向上している.実はとても簡単です:矢印の左側はパラメータで、矢印の右側は関数体で、あなたはすでにマスターしました!
    三、LimitとSkipパイプデータの切り取り
         Stream startsWithT = Stream.of("Monkey", "Lion", "Giraffe", "Lemur").limit(2);
         Stream startsWithT = Stream.of("Monkey", "Lion", "Giraffe", "Lemur").skip(2);
  • limtメソッドは、パイプ内の最初のn要素を切り取るための整数nを入力する.パイプ処理後のデータは[Monkey,Lion]である.
  • skipメソッドはlimitメソッドの使用とは逆に、前のn要素をスキップし、nから末尾までの要素を切り取るために使用される.パイプ処理後のデータは、[Giraffe,Lemur]
  • 四、Distinct元素の重量除去
    また、distinctメソッドを使用してパイプ内の要素を削除することもできます.削除すると要素間の比較に関連します.distinctメソッドでは、Objectのequalsメソッドを呼び出してオブジェクトの比較を行います.独自の比較ルールがあれば、equalsメソッドを書き換えることができます.
        Stream uniqueAnimals = Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
                .distinct();

    上のコードをリセットした結果、["Monkey","Lion","Giraffe","Lemur"]
    五、Sortedソート
    デフォルトではsortedはアルファベットの自然な順序でソートされます.以下のコードのソート結果は,[Giraffe,Lemur,Lion,Monkey],ワード数GがLより前,LがMより前である.1位は順番を区別できず、2位のアルファベットを比較します.
        Stream alphabeticOrder = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
                .sorted();

    場合によっては、ソートのルールをカスタマイズしたい場合があります.これはComparatorに使用する必要があります.忘れた方もいるかもしれませんが、javaベースのComparatorとComparableインタフェースを自分で振り返ることができます.次のコードは文字列の長さに基づいてソートされ、ソート結果は[Lion,Lemur,Monkey,Giraffe]です.
        Stream lengthOrder = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
                .sorted(Comparator.comparing(String::length));

    六、Mapデータ変換処理
    map()関数の役割は、パイプフローの各要素を、ある規則で別の要素に変換することです.次のコードで処理されたパイプの要素は、[monkey,lion,giraffe,lemur]、すべての要素のアルファベットがすべて小文字です.
        Stream lowerCase = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
                .map(String::toLowerCase);
        
        //              ,   lambda   ,          
        Stream lowerCase = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
                .map(s -> s.toLowerCase());

    map()関数は、データを処理するだけでなく、データのタイプを変換することもできます.次のようになります.
        IntStream lengths = Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
                .mapToInt(String::length);

    上記のコードの処理結果は,[6,4,7,5],ルールは文字列の長さである.パイプフローの文字列をmapToIntメソッドを使用してString::lengthをルールとして変換します.もちろんmapToIntに加えてmapToDouble()とmapToLong()メソッドも提供されています.変換ルール関数をカスタマイズして、int、double、longタイプの戻り値を返すことができます.
    ご注目をお待ちしております
  • ブロガーは最近、『SpringBootシリーズ-16章97節』
  • を手触りで教えてくれました.
  • 本文は転載して出典を明記します(必ず接続を持っていなければならなくて、文字だけを回転することができません):アルファベットの兄のブログ.