Javaのストリーム関数型プログラミングパートIII:結果プロセス流導管

A、Javaのストリームパイプラインデータは、操作の処理します

Javaのストリームパイプラインの流れが処理されているJavaのAPIのコレクション要素を単純化するために使用される前に、数の前に書かれたこの記事では、あなたを与えていました。使用中に3つのステージに分け。この記事を開始する前に、私はそれはまだ示されているように、これらの三つの段階を導入するために、いくつかの新しい友達を必要だと思います。

Javaのストリーム関数型プログラミング? あなたを与えるために使用されると言うのは良い、ケース詳細なグラフィック

  • (青色で示した)第一段階:コレクション配列、またはテキストファイルの行は、Javaストリーム流れダクトに変換されます。
  • 第二段階(図中破線):ストリーミングデータパイプライン処理動作、パイプライン内の各処理要素。次のパイプの入力要素としてパイプに出力要素。
  • (緑色で示される)第三段階:処理演算パイプラインフローの結果、即ちコアは、本明細書に記載されます。

始める前に、私たちは私たちの話、前の例に振り返る必要性が依然としてあります。


List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");

List<String> list = nameStrs.stream()
        .filter(s -> s.startsWith("L"))
        .map(String::toUpperCase)
        .sorted()
        .collect(toList());
System.out.println(list);
  • パイプラインの流れストリームのリストのための文字列を変換するにはまず、ストリームを使用して()メソッド
  • その後、操作を処理するデータをパイプ、すべての文字列が最初のフィルタ資本Lのfliter機能で始まる、その文字列は、大文字パイプのtoUpperCaseに変換され、その後、ランキング法をソート呼び出します。この番号の前の記事でAPIの使い方を紹介しています。これは、ラムダ式と関数参照するのに使用。
  • 最後に、コレクト機能結果処理は、パイプラインは、javaストリームのリストにストリームされます。出力結果の最終的なリストは以下のとおりです。[LEMUR, LION]

あなたは、Javaストリームパイプラインの流れを使用しない場合は、あなたが上記の機能を完了する必要がありますどのように多くのコードの行について考えますか?トピックに戻る、この記事では、第三相についてあなたを与えることです:パイプラインストリームの処理結果は、それが何をするのかすることができますか?それでは始めましょう!

二、のForEachとForEachOrdered

我々は結果だけではなく、変換のタイプよりも、ストリーム・パイプラインの流れを印刷することを願っていた場合、我々はforEachの()メソッドまたはforEachOrdered()メソッドを使用することができます。


Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .parallel()
        .forEach(System.out::println);
Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
        .parallel()
        .forEachOrdered(System.out::println);
  • パラレル()関数は、より速い速度を処理するように、むしろ一連の処理よりも並行してパイプライン処理要素、で表されます。しかし、これは要素の順序は保証できません前の要素の処理後、最初のストリーム処理パイプラインの背後にある要素につながる可能性が高いです
  • それは、データ処理シーケンスに保証するが、要素の出力のためにパイプラインフローに要素の順序と一致する保証する方法をforEachOrderedないかもしれないが、視点の名前から理解できるforEachOrdered。それは、(forEachのメソッドがこの順で保証されていません)、次のようなものです:
Monkey
Lion
Giraffe
Lemur
Lion

第三に、収集収集要素

最も一般的な用途は、Javaのストリームである:コレクションクラスは、パイプラインの流れを処理する2つのデータは、パイプは3つの処理結果は、クラスのセットに変換され、流れ流れ導管に変換します。次いで、収集()メソッドは、私たちのためにこのような機能を提供する:ダクトフロー処理結果は、クラスのセットに変換されます。

3.1コレクションが設定されています

Collectors.toSetによって収集ストリーム処理結果()メソッド、コレクションセットに集めすべての要素。


Set<String> collectToSet = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
) 
.collect(Collectors.toSet());

//最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set会去重。

3.2。収集リスト

同様に、要素が収集されてもよいList用いtoList()コレクタ。


List<String> collectToList = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
).collect(Collectors.toList());

// 最终collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

3.3。一般的な収集方法

上記の要素を導入するための収集方法、プライベートです。コレクションセットの使用Collectors.toList()リストタイプ、このようなセットとして集めCollectors.toSet()セットタイプを使用するなど。だから、より一般的なデータ収集モード、任意のタイプのサブコレクションインタフェースのデータ収集のない要素がありません。
あなたは、コンストラクタコレクションの種類を提供したい、すなわち方法:だから、ここで我々はあなたがコレクションのいずれかのタイプにデータ要素を収集することができ、共通の要素の収集方法として紹介します。


LinkedList<String> collectToCollection = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
).collect(Collectors.toCollection(LinkedList::new));

//最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

注:LinkedListのに使用されるコード::新しい、実際にコンストラクタのLinkedListを呼び出すと、リンクされたリストに要素を収集します。もちろん、あなたはまた、使用することができますLinkedHashSet::newし、PriorityQueue::newコレクションの他のタイプのために収集されたデータ要素なので、より一般的なの。

3.4。配列の収集

toArrayによって収集ストリーム処理結果(文字列[] ::新しい)すべての文字列の配列に収集エレメントの方法。


String[] toArray = Stream.of(
   "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
) .toArray(String[]::new);

//最终toArray字符串数组中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]

3.5。地図を収集

データ要素の使用Collectors.toMap()メソッドは、マップ内を収集するが、問題がある:要素キー、または値と同じパイプラインです。(ラムダ式の入力が出力されます) - 「>トントン」我々はに戻るには、単純だったFunction.identity()メソッドを使用します。使用して、さらに流通管ハンドラdistinct()地図を確実にするために、キーの一意性を。


Map<String, Integer> toMap = Stream.of(
    "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
)
.distinct()
.collect(Collectors.toMap(
       Function.identity(),   //元素输入就是输出,作为key
       s -> (int) s.chars().distinct().count()// 输入元素的不同的字母个数,作为value
));

// 最终toMap的结果是: {Monkey=6, Lion=4, Lemur=5, Giraffe=6}   

3.6。パケット収集groupingBy

Collectors.groupingByパケットは、別のリストの異なる要素の最初の文字に応じて収集したデータをどのように次のコードを示し、コレクションの要素を実装するために使用され、マップとしてパッケージ。


Map<Character, List<String>> groupingByList =  Stream.of(
    "Monkey", "Lion", "Giraffe", "Lemur", "Lion"
)
.collect(Collectors.groupingBy(
       s -> s.charAt(0) ,  //根据元素首字母分组,相同的在一组
       // counting()        // 加上这一行代码可以实现分组统计
));

// 最终groupingByList内的元素: {G=[Giraffe], L=[Lion, Lemur, Lion], M=[Monkey]}
//如果加上counting() ,结果是:  {G=1, L=3, M=1}

第四に、他の一般的に使用される方法


boolean containsTwo = IntStream.of(1, 2, 3).anyMatch(i -> i == 2);
// 判断管道中是否包含2,结果是: true

long nrOfAnimals = Stream.of(
    "Monkey", "Lion", "Giraffe", "Lemur"
).count();
// 管道中元素数据总计结果nrOfAnimals: 4


int sum = IntStream.of(1, 2, 3).sum();
// 管道中元素数据累加结果sum: 6


OptionalDouble average = IntStream.of(1, 2, 3).average();
//管道中元素数据平均值average: OptionalDouble[2.0]



int max = IntStream.of(1, 2, 3).max().orElse(0);
//管道中元素数据最大值max: 3



IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();
// 全面的统计结果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}

あなたの注意を楽しみにして

おすすめ

転載: www.cnblogs.com/zimug/p/11839517.html