関数式プログラミングについて

2892 ワード

1.はじめに
最近忙しくなってきて、書く時間が少なくなってきました.ここ数日からJava開発で関数式プログラミングスタイルを試みています.だから小さなものを書いて分かち合いましょう.
2.関数プログラミングとは?
私が見た関数数式プログラミングは、関数を一等公民として使用することです.普段、私たちの開発はデータを処理しています.オブジェクト向けにクラスが処理されます.関数式のプログラミングは関数を書くのではなく、関数を書く道です.Javaにおける関数式プログラミングの進化の道を見てみましょう.私は小さい頃、安価な白黒スクリーンゲーム機をやったことがあります.ロシアのブロックしかできません.これは拡張不可能です.
  public void playGame(){
         //          
  }

この機械は子供の頃に多くの楽しみをもたらした.その後、仲間にはgameboyがありました.このような携帯電話のメリットはカードを挿入できることです.1枚のカード1ゲームで、最も有名なのは「スーパーマリオ」と「レンガを打つ」です.この時機械は完全に拡張できるようになった.
      public void  playGameboy(GameboyCard card){
            card.getGame().run()
      }

拡張できますが、カードの価格は非常に高く、当時カードを買うルートはまだ少なかったです.その时、自分でゲームを作れたらいいなと思っていました.理想のゲーム机は、インタフェースに合ったゲームカードに入れて、私のゲーム机の中で走ればいいのです.
固定されたゲームカードインタフェースを定義しました
 /**
 * @author Felordcn
 * @since 2019/10/31 22:13
 */
@FunctionalInterface
public interface Card {

    Game  apply();

}

このインタフェースに合ったゲームカードさえあれば、機械に挿入して遊ぶことができます.
    /**
     * Fun.
     *
     * @param card the card
     */
    void fun(Card card) {
        Game game = card.apply();
        game.run();
    }

オブジェクト向けに熟練している学生たちは、これがインタフェース向けのプログラミングではないかと言います.はい、あなたの言うことは大丈夫です.しかし、ここではCardインターフェースがゲームを提供することだけをしています.私たちの重心はゲームカードですか?明らかに違う!面白いゲームこそ私たちの目的です.そこで私たちは彼がカードであろうとディスクであろうと、ネットであろうと、ゲームを提供して私たちに娯楽を提供することができる限り、私たちのニーズに合っています.
  //       
  fun(() -> new CardGame());
   //   PSP
   fun(() -> new PSPGame());
   // more

私たちとして、普段SQLを書いています.大きな工場でも小さな工場でも、単体でも分布式でも.SQLはいつも多くのビジネス関係の処理を解決してくれます.SELECTINSERTUPDATEDELETEの各コマンドはSQL仕様データベースであれば、どのテーブルでも一貫した操作になります.あなたが宣言したコマンドは、どのような操作を実行しますか.このとき,データと関数は緩やかに結合している.まさにこのような特徴が私たちに「万変不離其宗」を実現させた.これも別の関数式プログラミングです.
3.オブジェクト向けと関数式のプログラミングは衝突しますか?
オブジェクト向けは、私がどのようなデータを操作できるか、このようなデータをどのように操作できるかのパターンにあります.関数式プログラミングはずっと私にデータを操作する方法に浸っています.オブジェクト向けの最大の利点は、マルチステート性とパッケージングです.関数式プログラミングの利点は抽象化と宣言式コマンドスタイルであり、両者は実際には直交しており、相補的であり、同じプログラムで共存することができる.論争が対象に向かうか関数に向かうかは、どの言語が良いかを論争するのと同じように極端だ.オブジェクト向けにとって、存在するのは必ずしもオブジェクトではなく、関数はオブジェクトです.関数式プログラミングにとって、存在するのは必ずしも純粋ではなく、副作用は常に実在している.要するに,オブジェクト向けは分解に重点を置き,関数プログラミングは組合せに重点を置く.
4.関数式プログラミングの特徴
関数スタイルのプログラミングには、次のような特徴があります.
  • 関数は一等公民として機能する.パラメータとして渡したり、関数から返したり、変数に値を付けたりすることができます.
  • は閉パッケージLambda式と匿名関数を持ち,これは広範な多態である.
  • 不変性、大部分の無状態処理、関数式プログラムでは、変数は外部から入力されるか、または明示的に値を得る.変数は変更できません
  • は、可変であり、副作用のない呼び出しに基づいている.
  • は、 tail callによって再帰的な性能最適化を実現する.
  • は、動的で組み合わせ可能な開発構想を提供する.

  • 5.まとめ
    今日は私の関数式プログラミングに対するいくつかの理解を簡単に表現しましたが、オブジェクト向けのJava開発者に慣れているので、関数式プログラミングを理解するのは容易ではありません.Lambdaと匿名関数だけではありません!もっと多いのは一つの思想です.ここではJava関数式プログラミングライブラリvavrをお勧めします.興味のある学生は勉強してもいいです. :Felordcn
    個人ブログ:https://felord.cn