ビデオ: 【day29】22 尚硅谷 Java语言高级 Stream的中间操作:映射 2024
Javaは、ストリームとラムダ式を最適に使用するファンシーなメソッドを持っています。ストリームとラムダ式を使用すると、アセンブリ行を作成できます。アセンブリラインソリューションは、関数型プログラミングの概念を使用します。
組立ラインは、いくつかの方法で構成されています。各メソッドはデータを取り込み、何らかの方法でデータを変換し、その結果を次のメソッドに渡します。ここに組立ラインがあります。
<! - 1 - > 関数型プログラミングアセンブリライン。各ボックスは、組立ラインに沿って変形される一連の原材料を表します。それぞれの矢印は、メソッド(または、比喩的に、組み立てライン上の作業者)を表します。
たとえば、2番目のボックスから3番目のボックスへの移行では、ワーカーメソッド( メソッド)は、DVDではないアイテムの売り出しを中断します。ルーシー・リカルドが第2と第3の箱の間に立って、各本やCDを組立ラインから取り出し、それを不注意に床に投げ込むと想像してください。
<! Javaの
filter
Predicate
- 結果が
boolean
のラムダ式です。
filter
メソッドは、ラムダ式の
true / false
テストに合格しない項目を送り出します。
いくつかの関数型プログラミングメソッド
メソッド名
メンバ
結果値 | ストリーム | コレクション | (たとえば、 | ストリーム |
ストリーム
|
コレクション
ストリーム
ストリーム
ストリーム |
ストリーム |
>ラムダ式が返す値を含む新しいストリーム
|
true |
map
|
Stream
|
関数
|
Stream
|
ラムダ式を入力ストリームに適用した結果を含む新しいストリーム
Stream
|
Stream
|
BinaryOperator
|
|
BinaryOperator
|
で使用される型入力ストリームのすべての値を結合した結果 |
<! 3番目のボックスから4番目のボックスへの遷移では、ワーカー・メソッド(
|
map
|
メソッド)は、
|
販売
。その従業員の場所から、組立ラインには999の値
|
しか含まれていません。 |
マップ
メソッドは
(
(sale) - > saleなどの
ファンクション
を使用します。 getPrice()
を呼び出し、
Function
をストリームの各値に適用します。したがって、
マップ
メソッドは、
セールス
オブジェクトの受信ストリームを受け取り、
価格
値の発信ストリームを作成します。
4番目のボックスから5番目のボックスへの移行では、ワーカーメソッド(
reduce
メソッド)がDVDの販売価格を加算します。Javaの
reduce
メソッドは2つのパラメータをとります。
最初のパラメータは初期値です。
上記の画像では、初期値は
0です。 0 999である。
第2のパラメータは、
BinaryOperator
である。
上記のイメージでは、
reduceメソッド
BinaryOperator
は
(price1、price2) - > price1 + price2
メソッドを減らす
BinaryOperator
を使用して、入力ストリームからの値を結合します。初期値は、すべての結合の開始点として機能します。したがって、
reduce
メソッドは2つの追加を行います。
reduceメソッドは、入力ストリームから2つの値を加算します。
比較のために、
3の値を含むストリームで
reduce(10。0、(value1、value2) - > value1 * value2)
を呼び出すとします。 0 999、999。 0 999および999である。 0 999である。結果のアクションを以下に示します。
reduceメソッドは、入力ストリームからの値を乗算します。
あなたはGoogleのMapReduceプログラミングモデルについて聞いたことがあります。プログラミングモデルの名前とJavaメソッド名
map
と
reduce
の類似点は偶然ではありません。
全体として、組立全体が売れたDVDの価格を上回っています。上記のコードには、上の最初の画像であるストリームとラムダ式を使用する完全なプログラムが含まれています。
import java。 util。配列リスト;
パブリッククラスTallySales {
public static void main(String [] args){ ArrayList
sales = new ArrayList <>();
NumberFormat currency = NumberFormat。 getCurrencyInstance();
fillTheList(sales);
倍合計=売上。 stream()
。フィルタ((sale) - > sale。getItem()。equals( "DVD"))
。 map((sale) - > sale。getPrice())
システム。でる。 println(通貨。書式(合計));
}
静的void fillTheList(ArrayList
販売){
販売。追加する(新しい販売( "DVD"、15. 00));
売上高。追加する(新しい販売( "Book"、12. 00));
売上高。追加する(新しい販売(「DVD」、21. 00));
売上高。追加(新しい販売( "CD"、5. 25));
}
}
コードにはJava 8以降が必要です。 IDEが以前のJavaバージョン用に設定されている場合は、IDEの設定を変更する必要があります。新しいバージョンのJavaをダウンロードする必要があります。
たとえば、太字のコードの始まりの近くでは、
sales
という名前は
ArrayList
オブジェクトを参照します。各
ArrayList
オブジェクトには、
ストリーム
メソッドがあります。上のコードでは、
は、その
ArrayList
オブジェクトの
ストリーム
メソッドへの呼び出しです。
streamメソッドはJavaの
Stream
クラスのインスタンスを返します。 (なんと驚き!)だから
の売上。 stream()999は、999のStreamオブジェクトを指す。
すべてのDVD販売を取得します。
すべての
Stream
オブジェクトには、
フィルタ
メソッドがあります。だから
の売上。ストリーム()。
Stream
オブジェクトの
フィルタ
メソッドへの呼び出しです。
パターンが続きます。
ストリーム
オブジェクトの
マップ
メソッドは、さらに別の
ストリーム
オブジェクト - 価格を含む
ストリーム
オブジェクトを返します。
各DVD販売価格を取得する。
ストリーム
には、
299
の値をとる
reduce
メソッドを適用します。これはDVD価格の合計です。
すべてのDVD販売の合計価格を取得する。