Android---Kotlin の学習 012

関数型プログラミング

私たちはオブジェクト指向プログラミング パラダイム (パラダイムはルーチン) を学習してきましたが、もう 1 つのよく知られたプログラミング パラダイムは、1950 年代に誕生し、抽象数学のラムダ計算に基づいて開発された関数プログラミングです。商用ソフトウェアではなく学術分野でより一般的に使用されていますが、その原則の一部はあらゆるプログラミング言語に当てはまります。関数プログラミング パラダイムは、主に高階関数 (パラメーターとして関数を受け取る関数、または関数を返す関数) によって返されるデータに依存します。これらの高階関数はさまざまなコレクションの処理専用であり、複数の同様の関数を簡単に組み合わせてチェーン操作を構築できます。複雑な計算動作を作成します。Kotlin は複数のプログラミング パラダイムをサポートしているため、オブジェクト指向と関数型プログラミングのパラダイムを組み合わせて、当面の問題を解決できます。

関数クラス

関数型アプリケーションは通常、変換、フィルター、結合という3 つの主要なタイプの関数で構成されます。各種類の関数は、最終結果を生成することを目的として、コレクション データ型用に設計されています。関数型プログラミングで使用される関数は構成可能です。つまり、複数の単純な関数を組み合わせて複雑なコンピューティング動作を構築できます。

変身

変換は、関数型プログラミングにおける最初のタイプの関数です。変換関数は、コレクションの内容を走査し値パラメータとして渡された変換関数を使用して各要素を変換し、変更された要素を含むコレクションをチェーン内の他の要素に返します。。 関数。

最も一般的に使用される 2 つの変換関数は、 Map と flatMap です。

\弾丸 変換機能マップ

マップ変換関数はレシーバー コレクションを走査し、トランスフォーマー関数にコレクション内の各要素を作用させ、変更された要素を含むコレクションとして結果を返します。この結果は、チェーン内の次の関数の入力として使用されます。

ご覧のとおり、元のコレクションは変更されていません。定義したマップ変換関数とトランスフォーマー関数の作業が完了すると、新しいコレクションが返されるため、変数を何度も変更する必要はありません。

実際、関数型プログラミングのパラダイムは、不変データのコピーがチェーン内の関数間で受け渡されるという設計思想をサポートしています。

マップによって返されるセット内の要素の数は、入力セットと同じである必要があります。ただし、返される新しいコレクション内の要素は異なるタイプである可能性があります。

\弾丸 変換関数 flatMap

flatMap 関数は、コレクションのコレクションを操作し、複数のコレクションの要素を結合して、すべての要素を含む 1 つのコレクションを返します。

フィルター

フィルタリングは関数型プログラミングで2 番目に大きいタイプの関数です。フィルタリング関数は述語関数を受け入れ、それを使用して指定された条件に従って受信側コレクション内の要素をチェックし、真か偽かを判断します。述語関数がtrueを返す場合、チェックされた要素はフィルター関数によって返される新しいコレクションに追加されます。述語関数がfalseを返した場合、チェックされた要素は新しいコレクションから削除されます。

\弾丸 フィルタ機能 フィルタ

filter フィルター関数は述語関数を受け入れます。 flatMap が入力コレクション内のすべての要素を走査するとき、フィルター関数は述語関数に条件を満たすすべての要素を、フィルター条件に従って返される新しいコレクションに入れます。最後に、 flatMap は、transformer 関数によって返されたサブコレクションを新しいコレクションにマージします。

ケース: フィルターを通して素数を見つける

素数とは、1 とそれ自体以外の数で割り切れない数です。いくつかの単純な関数だけを使用して、素数を見つけるというより複雑な問題を解決しました。これが関数型プログラミングの独特の魅力です。各関数は少しのことを行いますが、組み合わせると大きなことを行うことができます

Java コードで記述する場合は、必ず for ループを使用する必要がありますが、これはそれほど簡潔ではありません。 

マージ

Merge は、関数型プログラミングにおける 3 番目の主要な関数タイプです。merge 関数は、異なるコレクションを新しいコレクションにマージできます。これは、 collection を含むコレクションをレシーバーとするflatMap 関数とは異なります

\弾丸 ジップ

zip マージ関数は、 2 つのコレクションをマージし、キーと値のペアを含む新しいコレクションを返すために使用されます。

\弾丸 折り畳み

値をマージするために使用できるもう 1 つのマージ類似関数は、fold です。このマージ関数は、初期アキュムレータ値を受け入れ、その後、匿名関数の結果に基づいて更新されます

例: コレクションを走査し、各要素の値を 3 で乗算し、それらを合計します。

関数型プログラミングを使用する理由

一見すると、同じタスクを実現する場合、Java バージョンと機能バージョンのコード量はほぼ同じですが、注意深く分析すると、機能バージョンの多くの利点がわかります。

\弾丸 累積変数 (employee ShirtSizes) は暗黙的に定義されます。

\弾丸 関数の演算結果は蓄積された変数に自動的に割り当てられるため、コード エラーの可能性が低くなります。

\弾丸 新しいタスクを実行する関数は、Iterable 型と互換性があるため、関数チェーンに簡単に追加できます。

順序

List、Set、および Map コレクション タイプは、総称して初期コレクションと呼ばれます。これらのコレクションのいずれかのインスタンスが作成されると、それに含まれる要素が追加され、アクセスできるようになります初期のコレクションに対応して、Kotlin には別のタイプのコレクションがあります:遅延コレクション(遅延コレクション) は、クラスの遅延初期化に似ています。遅延コレクション タイプのパフォーマンスは、特に多数の要素を含むコレクションに使用した場合に優れています。コレクション要素はオンデマンドであるため、生産されます

Kotlin には Sequence と呼ばれる組み込みの遅延コレクション タイプがあり、Sequence はコンテンツのインデックス付けや並べ替え、要素の数の記録を行いません。実際、シーケンスを使用する場合、データ ソースは無限の数の要素を生成できるため、シーケンス内に無限の数の値が存在する可能性があります。

シーケンスの生成

シーケンスの場合、シーケンス内で新しい値が生成されるたびに呼び出される関数を定義できます。このような関数はイテレータ関数と呼ばれます。シーケンスとそのイテレータを定義するには、Kotlin のシーケンス コンストラクターのgenerateSequence 、generateSequence 関数を使用できます。シーケンスの開始値として初期シード値を受け入れます。generateSequence で定義されたシーケンスで関数を呼び出すと、generateSequence 関数は指定したイテレータ関数を呼び出して、生成される次の値を決定します。

例: 1000 個の素数を生成する

1,000 個もありません。1000 個を取得したい場合は、シーケンスを使用できます。

おすすめ

転載: blog.csdn.net/qq_44950283/article/details/135114114