Java Stream関数式プログラミング図文詳細解(二):パイプデータ処理
4876 ワード
一、Java Streamパイプデータ処理操作
この号の前に発表した「Java Stream関数式プログラミング?使ってもいいですが、判例図の詳細をお届けします」では、Java Streamの紹介や簡単な使い方をご紹介しました.この文書を開始する前に、Java Streamデータ処理手順図を紹介する必要があります.図は主に3つの部分に分かれています.配列、集合クラス、テキストファイルをパイプフロー(図中の青いブロックの部分、本号の前の記事で紹介した) に変換 Java Streamパイプラインデータ処理操作(すなわち、下図の中間の破線内のデータ処理操作、本明細書の主な内容) .パイプフロー処理結果の集約、累積、カウント、集合クラスへの変換などの動作(図中の緑色ブロック部分) .
Java Streamの中間データ処理操作の入力はパイプラインフロー(Stream)であり、出力はパイプラインフロー(Stream)であることに注意してください.次は詳しく勉強しましょう.前の記事では、次のような例を示しました.
この例では、まずstream()関数を使用して配列をパイプフローに変換し、次にパイプフローの要素をフィルタフィルタ()し、Lの先頭の要素のみを保持し、各要素を大文字(map(String::toUpperCase))に変換し、sorted()をソートし、最終的にListタイプに変換する機能を果たします.処理後の出力結果は、
二、filterパイプデータフィルタ
筆者の経験によれば、
Lambda式を習ったことがない学生は、上のコードに戸惑うかもしれません.実は簡単です.lambda式は関数を表現するために使用され、矢印の左側はパラメータで、矢印の右側は関数体です.関数のパラメータタイプと戻り値タイプは、コンテキストに基づいて自動化された判断を行い、管理する必要はありません.上記のlambda式は関数として書かれています.
この構文がコードの可読性を低下させるというlambda式の使用を排斥する人も見たことがある.これはどういうことですか.もし専門誌に英語の専門名詞と引用が含まれていて、読者がちょうど英語ができないと読みたくないなら、これは文章の問題ではなく、読者の問題だと思います.またlamdba式は様々なプログラミング言語で広く使用され,符号化効率が向上している.実はとても簡単です:矢印の左側はパラメータで、矢印の右側は関数体で、あなたはすでにマスターしました!
三、LimitとSkipパイプデータの切り取り limtメソッドは、パイプ内の最初のn要素を切り取るための整数nを入力する.パイプ処理後のデータは[Monkey,Lion]である. skipメソッドはlimitメソッドの使用とは逆に、前のn要素をスキップし、nから末尾までの要素を切り取るために使用される.パイプ処理後のデータは、[Giraffe,Lemur] 四、Distinct元素の重量除去
また、distinctメソッドを使用してパイプ内の要素を削除することもできます.削除すると要素間の比較に関連します.distinctメソッドでは、Objectのequalsメソッドを呼び出してオブジェクトの比較を行います.独自の比較ルールがあれば、equalsメソッドを書き換えることができます.
上のコードをリセットした結果、["Monkey","Lion","Giraffe","Lemur"]
五、Sortedソート
デフォルトではsortedはアルファベットの自然な順序でソートされます.以下のコードのソート結果は,[Giraffe,Lemur,Lion,Monkey],ワード数GがLより前,LがMより前である.1位は順番を区別できず、2位のアルファベットを比較します.
場合によっては、ソートのルールをカスタマイズしたい場合があります.これはComparatorに使用する必要があります.忘れた方もいるかもしれませんが、javaベースのComparatorとComparableインタフェースを自分で振り返ることができます.次のコードは文字列の長さに基づいてソートされ、ソート結果は[Lion,Lemur,Monkey,Giraffe]です.
六、Mapデータ変換処理
map()関数の役割は、パイプフローの各要素を、ある規則で別の要素に変換することです.次のコードで処理されたパイプの要素は、[monkey,lion,giraffe,lemur]、すべての要素のアルファベットがすべて小文字です.
map()関数は、データを処理するだけでなく、データのタイプを変換することもできます.次のようになります.
上記のコードの処理結果は,[6,4,7,5],ルールは文字列の長さである.パイプフローの文字列をmapToIntメソッドを使用してString::lengthをルールとして変換します.もちろんmapToIntに加えてmapToDouble()とmapToLong()メソッドも提供されています.変換ルール関数をカスタマイズして、int、double、longタイプの戻り値を返すことができます.
ご注目をお待ちしておりますブロガーは最近、『SpringBootシリーズ-16章97節』 を手触りで教えてくれました.本文は転載して出典を明記します(必ず接続を持っていなければならなくて、文字だけを回転することができません):アルファベットの兄のブログ.
この号の前に発表した「Java Stream関数式プログラミング?使ってもいいですが、判例図の詳細をお届けします」では、Java Streamの紹介や簡単な使い方をご紹介しました.この文書を開始する前に、Java Streamデータ処理手順図を紹介する必要があります.図は主に3つの部分に分かれています.
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);
また、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タイプの戻り値を返すことができます.
ご注目をお待ちしております