Java8使用してストリーミング

スクリーニングとスライスしました

スクリーニング述語

ストリームインタフェースがサポートフィルタ方式。この操作は、引数として(関数はブール値を返す)述語を受け入れ、述語のすべての要素を含むストリームの適合を返すであろう。たとえば、すべてのベジタリアンメニューアウトフィルタは、ベジタリアンメニューを作成します。

List<Dish> vegetarianMenu = menu.stream().filter(Dish::isVegetarian).collect(toList());

異なる要素のスクリーニング

  流れはまた異なったというメソッドをサポートしており、それは、ストリームの異なる要素を返します。たとえば、すべての偶数のリストうち、フィルタ、および何の重複がないことを確認してください。

List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
numbers.stream().filter(i -> i % 2 == 0 ).distinct().forEach(System.out::println);

切り捨てられた流れ

  支持フロー制限指定されたストリームを超えない長さを返す(n)の方法。長さの制限に引数として必要。ストリームが秩序ある場合、それは最初のn個の要素まで戻ります。例えば、リストの設立は、熱の300個の以上のカロリーは、最初の3つのコースを選びます:

List<Dish> dishes = menu.stream().filter(d -> d.getCalories() > 300).limit(3).collect(toList());

:制限は、ソースが設定されているような、カオス的流れに使用することができます。この場合、結果は任意の順序で制限するものではありません。

要素をスキップ

  さらに支持スキップ(N)メソッドをストリーミングするストリームは、最初のn個の要素を投げ返します。ストリームは以下のn番目の要素、空のストリームを超える場合。
:限界(n)とスキップ(N)が相補的である、例えば、次のコードは、300個のを超えるカロリー最初の2つのコースをスキップし、残りを返します。

List<Dish> dishes = menu.stream().filter(d -> d.getCalories() > 300 ).skip(2).collect(toList());

マッピング

  非常に一般的なデータ処理ルーチンは、オブジェクトから特定の情報を選択することです。たとえば、SQLには、テーブルからいずれかを選択することができます。ストリームAPIは、マップやflatMapメソッドを通じて同様のツールを提供します。

各エレメント・アプリケーション機能に対流

  パラメータとして関数を受け取り支援マップ方法を、ストリーミング。この関数は、各要素に適用され、それは同様の変換であるため、用語のマップを使用して(新しい要素にそれをマッピングしますが、ニュアンスは、それがあること「の新バージョンを作成する」のではなくなります"編集")。たとえば、次のコードでメソッド参照がディッシュ::のgetNameは、料理・ストリームの名前を抽出するために、マップ・メソッドを渡さ:

List<String> dishNames =  menu.stream().map(Dish::getName).collect(toList());

あなたが各皿のどのくらいの名前を知りたい場合は、どのように?これは次のようになります

List<Integer> dishNameLengths = menu.stream().map(Dish::getName).map(String::length).collect(toList());

最初のステップは、ストリームのメニュー名を取得し、メニュー名の長さを取得することであり、リストを返します

フラットストリーム

  単語のリストについては、どのように異なる文字が一覧表示されますリストを返すには?例えば、単語リスト[ "こんにちは"、 "世界"与えられた ]、 あなたは[ "H"、 "E"のリストを返すようにしたい "L"、 "O"、 "W"、 "R"、 "D"、]
FlatMapは、自分の目標を達成するために使用することができます。

List<String> uniqueCharacters = words.stream().map(w -> w.split("")).flatMap(Arrays::stream).distinct().collect(Collections.toList())

いない各配列は(配列の内容は、コンテンツストリームを形成する、マップアウトされ、組み合わされた流れが達成される)ストリームにマッピングするが、コンテンツストリームにマッピングされるという効果を用いFlatMap方法。単一ストリーム・マップ(配列::ストリーム)を使用して生成されたすべてのフラット流れにマージされます。
要するに、あなたは、ストリームごとに値を入れるためにflatMapの方法は、すべてのストリームに一緒に接続されたストリーム、別のストリームに置き換えられています。

検索と一致

  他の一般的なデータ処理ルーチンは、データセットの一部の要素を見ることである指定された属性にマッチします。ストリームAPIは、このようなツールallMatch、anyMatch、noneMatch、FindFirstのfindAnyおよび方法を提供します。

述語の一致に少なくとも1つの元素をチェック

「与えられた述語の流れにマッチする要素があれば。」anyMatch方法は答えること たとえば、あなたはベジタリアンメニューオプションがあるかどうかを確認するためにそれを使用することができます。

if (menu.stream().anyMatch(Dish::isVegetarian){
	System.out.println("The menu is vegetarian friendly!")
}

述語は、すべての要素にマッチするチェック

料理は、熱の1,000未満のカロリーであるかどうかをチェックするAllMatch

boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000)

これとは対照的にnoneMatch、上記の例を書き換えることが可能です。

boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories() >= 1000)

要素を見つけます

findAnyメソッドは、現在のストリーム内の任意の要素を返します。これは、他のストリーム動作と組み合わせることができます。あなたは、クエリのベジタリアン料理を実装するためのフィルタとfindAnyの方法を組み合わせることができます。

Optional<Dish> dish = menu.stream().filter(Dish::isVegetarian).findAny();

最初の要素を探します

  いくつかの順次ストリームは、論理的な順序を指定するには、表示されます(例えば、リストまたはデータが生成された列をストリームソート)項目がストリームに表示されます。番号のリストを考えると、次のコードは3で最初に平方数の割り切れるを見つけることができます。

List<Integer> someNumbers = Arrays.aslist(1,2,3,4,5);
Optional<Integer> firstSquareDivisibleByThree = 
		someNumbers.stream().map(x -> x * x).filter(x -> x % 3 == 0)
					.findFirst();//9

:この関数は、FindFirstとfindAnyを使用する場合は
パラレル・ストリームを使用している場合、それはより制限されるので、あなたが、findAnyを使用する要素の復帰を気にしない場合は、より多くの並列の制限の最初の要素を見つけます。

削減

要約する要素

要素の合計:

int sum = numbers.stream().reduce(0,(a,b) -> a + b);

変形:

int sum = numbers.stream().reduce(0,(a,b) -> Integer.sum(a,b))

さらに変形:

int sum = numbers.stream().reduce(0,Integer::sum);

何の初期値の場合について:
短縮バリアント重い負荷が存在しない、それは初期値を受け入れませんが、オブジェクトは、オプションを返します。

Optional<Integer> sum = numbers.stream().reduce((a,b) -> a + b);

要素には流れていない、そしてそれは初期値を持っていないので、自分に戻ることができない操作減らした場合。オブジェクトを表示するようにして存在しない可能性がオプションに包まれていたのはこのためです。

最大値と最小値

最大値を計算します。

Optional<Integer> max = numbers.stream().reduce(Integer::max);

の最小値を計算します:

Optional<Integer> min = numbers.stream().reduce(Integer::min);

ストリームの数を計算する:
方法A :.のIntカウント= menu.stream()マップ(D - > 1).reduce(0、(B)は- > + b)は、
コネクションマップとは、一般的に呼ば減らしますGoogleはウェブを検索するためにそれを使用するので、モードをマップ減らすことが並列化が容易であることから有名です。
方法2:長い数= menu.stream()のカウント ();.

公開された75元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/zhengdong12345/article/details/102537867