jdk1.8新機能(III)-stream 2の流れ特性

1.はじめコレクター
  最終結果は、異なる形で提示することができるように、コレクタは、最終仕上げストリームをマッピングするためにスクリーニングしました。
  この方法は、収集コレクタ詳細コレクタを達成するためのインタフェースとして受け取るコレクタ、である集めます。
  また、カスタム実装コレクタインターフェースすることができ、そのコレクタをカスタマイズするために、コレクタ・インタフェースは、我々が直接その形式のストリームの結果を使用することができる多くの方法のデフォルトの実装を提供します。
  ここでは、カスタムコレクターは次のブログ記事でご紹介しますコレクタ共通デフォルトの静的メソッドを、ご紹介します。
 
コレクターの2.
 
  2.1削減
   要素の一つのストリームは、還元の一つの要素は、最良値、縮小操作が平均化され、そのような和として、値に「折り畳まれます」。
 
   2.1.1カウント
 
    長い数= list.stream()
                    .collect(Collectors.counting());
    カウント機能は、コレクタを使用しなくてもよいです。
 
    長い数= list.stream()(カウント)。
    注意:集計の結果は、長さでなければなりません。
 
  最も値を2.1.2
      例:最古の人の所有者を見つけるために

    オプション<人> oldPerson = list.stream()
                    .collect(Collectors.maxBy(Comparator.comparingInt(人:: getAge))); 12
  最も値を計算し、使用Collector.maxBy Collector.minByを必要とし、二つの機能は、コンパレータComparator.comparingIntに合格する必要がありますが、また、受信電界コンパレータが比較されます。
  コレクタは、オプション型の値を返します。
  会場への任意のクラス紹介:Java8新機能--StreamAPI(A)
 
  2.1.3合計
    例:すべての年齢の合計を計算
  int型の合計= list.stream()
                    .collect(Collectors.summingInt(人:: getAge)); 12
Java8はsummingIntを提供しているのでもちろん、それはまたsummingLong、summingDoubleを提供します。
 
  2.1.4平均化
    例:すべての年齢の平均計算
  二重の平均値= list.stream()
                    .collect(Collectors.averagingInt(人:: getAge)); 12
注:平均値を計算する場合、オブジェクトがint、長い、二重、必ずしも二重結果を計算されているかどうか。
 
   すべての使い捨てリダクション操作の2.1.5計算
    Collectors.summarizingIntワンタイム関数の値は、最も平均値になる、計算されIntSummaryStatisics内のオブジェクトに格納されているすべての要素数の合計。
オブジェクトのgetXXX()関数によって、これらの値を取得します。
 
  2.1.6接続文字列
    例:文字列にすべての名前

  文字列名= list.stream()
                        .collect(Collectors.joining()); 12
  所望であれば、各列のデフォルトデリミタはスペースは、区切り文字を指定し、パラメータが接合で添加することができるされています。
 
  文字列名= list.stream()
                        .collect(Collectors.joining( "")); 12
  このとき、文字列のカンマの間の区切り。
 
 一般的なリダクション操作を2.1.7
  あなたが縮小操作をカスタマイズする必要がある場合は、3つのパラメータを受け入れCollectors.reducing機能を使用する必要があります。

  最初のパラメーターの減少の初期値である
  2番目のパラメータは、フィールド縮小操作である
  第三のパラメータは、操作の減少であります
 
  例:すべての年齢の合計を計算
  オプションの<整数> sumAge = list.stream()
                                    .collect(Collectors.reducing(0、人:: getAge、(i、j)が- > i)がJ + 1); 12
  上記の例では、還元関数は3つのパラメータの合計を受けました。

    最初のパラメータは初期値の削減を示しています。我々が蓄積する必要があるので、初期値は0である
    2番目のパラメータがフィールドに必要な減速操作を示しています。ここでは、年齢フィールドPersonオブジェクトの上に蓄積します。
    第三のパラメータは、還元プロセスを示します。このパラメータは、ラムダ式を受け取り、このラムダ式は、2つのパラメータを持っている必要があり、現在に隣接する2つの要素を表します。我々が蓄積する必要があるため、私たちは2つのだけの隣接する要素まで追加する必要があります。
  Collectors.reducing方法はまた、単一のパラメータのオーバーロード形態を提供します。
  あなただけ減少(すなわち、第三の引き数)、他の2つのパラメータはデフォルト値である方法の通過中に動作する必要があります。

  流れに対する第1のパラメータのデフォルト値の最初の要素
  のエレメンタリストリームの2番目のパラメータのデフォルト
  要素が数値タイプの現在のストリームを入力し、削減目標に供されることを意味します。
 
  単一のパラメータの合計を減らすの時代には、すべてのために計算されます。例
 

  オプションの<整数> sumAge = list.stream()
            .filter(人:: getAge)
            .collect(Collectors.reducing((i、j)は- > I + jが)); 123
 
2.2パケット
  パケットストリームは、SQL文のGROUPBYに似指定されたカテゴリ内の要素に応じて分割されます。
 
2.2.1グループ化

  例:高齢者、中年、若者にみんな
 

地図<文字列、リスト<人>>結果= list.stream()
                                    .collect(Collectors.groupingby((人) - > {
        場合(person.getAge()> 60)
            リターン"老年人"、
        それ以外の場合は(人。 getAge()> 40)
            の復帰"中年人";
        他に
            復帰"青年人";
                                    })); 123456789
groupingby関数は、文字列の文字列型を返すラムダ式を受け取り、電流の流れは、グループ化されたラムダ文字列が返さ要素groupingbyう。
結果はグループ化地図<文字列、リスト<人>>で 、マップのキーがグループ名で、マップ値は、グループのPerosnコレクションです。
 
2.2.2マルチレベルグルーピング
  マルチレベルグループは、グループの各グループ毎に別々に、グループの完了後に支持してもよく。
  これは、多段パケットgroupingbyオーバーロードされたメソッドは、2つのパラメータを有する使用して実現することができます。

    最初のパラメータ:グルーピング条件
    第二引数:条件の2つのグループを含む新しい機能を、groupingby
 
      例:男性と女性のグループ:高齢者、中年、若者へのみんな、そして各グループが分割されます。

  地図<文字列、地図<文字列、リスト<人>>>結果= list.stream()
                                    .collect(Collectors.groupingby((人) - > {
        場合(person.getAge()> 60)
            リターン"老年人"。
        それ以外の場合(person.getAge()> 40)
            の復帰"中年人";
        他に
            復帰"青年人";
                                    }、
                                    groupingby(人:: getSex))); 12345678910
地図<文字列、地図<文字列、リスト<人>>>:この1は、複雑な結果を返します。
 
  パケットの統計情報を2.2.3
    いくつかのグループよりも多くを提供するだけでなく、統計のグループ化の結果ではない2つのパラメータのみgroupingby機能を持っています。

    各人口統計グループ:例
 

地図<文字列、ロング>結果= list.stream()
                                    .collect(Collectors.groupingby((人) - > {
        場合(person.getAge()> 60)
            リターン"老年人"、
        それ以外の場合(person.getAge() > 40)
            戻る"中年人";
        他
            戻り"青年人";
                                    }、
                                    カウント())); 12345678910
この時点でマップ、マップのキーグループ名、マップの設定値の要素数の地図<文字列、ロング>タイプを返します。
 
別の型のコレクタに結果を変換します
maxBy、minBy統計的に最大の価値を使用する場合は、オプションパッケージになり、ストリームタイプは、空の空の事態を避けるために、計算の結果です。オプションの戻り値の型がmaxBy、単独のminBy機能を使用する必要がない、これはありませんnullポインタ例外ことを保証します。我々はgroupingByグループを使用するときに、グループが空の場合、地図内のすべての値が空集合ならないようにしかし、、そのグループは、地図に追加されません。この場合、各グループの最もminBy値の算出方法は、任意のオブジェクトにカプセル化された結果は不要になったときに、maxByを使用します。
我々はmaxBy、minByはオプションのオブジェクト変換を返しますcollectingAndThen機能パッケージmaxBy、minByを、使用することができます。

  例:性別、所有者、および最大年齢層を計算します。
 

地図<文字列、整数>マップ= list.stream()
                            .collect(groupingBy(人:: getSex、
                            collectingAndThen(
                            maxBy(comparingInt(人:: getAge))、
                            オプション::取得
                            ))); 123456
この時点では、各グループのグループ名を表す地図<文字列、整数>、文字列(オスとメス)を返し、整数は最古のグループです。
あなたはcollectingAndThen maxBy包まれていない場合は、最終結果の地図<文字列、オプションの<人>>に対して返さ 。
collectingAndThenを使用した後最初のオプションの実行後に実行されます::取得、オプションの要素を取り出すようにmaxBy機能を実行します、maxByを包みました。
 
2.3パーティション
  パケットを分割することは特殊なケースで、それは本当、偽のグループに分けることができます。
  方法を使用してPartitioningByパケット、方法は、ブール式を返す必要がラムダ式を受け取り、ラムダpartitioningBy方法は、グループ内の各要素に対して真と偽の結果を返します。
  結果partitioningBy方法は<ブール、リスト<T >>を地図に返し 。
  さらに、partitioningBy groupingBy方法および方法としてはまた、第2のパラメータと、2つのパーティション、またはパーティション統計結果を受信することができます。

おすすめ

転載: www.cnblogs.com/helloworldmybokeyuan/p/11585171.html