[TIL]1月18日


かんすうしきプログラミング


以下のブログの内容を整理する
関数式プログラミングの基礎(1)なぜ関数式プログラミングなのか
[JAVA 8]-関数式プログラミング

  • オブジェクト向けプログラミングと関数式プログラミングの違い
    管理
  • ステータスポイント
  • オブジェクトに向けて状態をオブジェクト内に格納し、状態実現機能を利用する.
  • 関数プログラミングは、制御状態ではなく状態の除去に力を入れている.関数自体に入力値が含まれている場合、ステータスは特定の出力値として保存されません.

  • コードを簡潔に記述し、オブジェクトとは異なる方法でアクセスできます.

  • 関数式プログラミングはいくつかのデータ構造(list,set,map)を利用して動作を最適化する

  • 上のブログでサンプルコードを見ましたが、理解できません.StreamとRamdaを学ぶべきだと思います.

  • 浮動小数点効果を除去し、純粋な関数を作成し、モジュール化の程度を向上させるプログラミングモード.
  • 副手効果とは何ですか?
  • 所与の値(パラメータ)以外の外部要因は、プログラム実行
  • に影響を与えるべきではない.
  • 純関数
  • 1.対象は命令式プログラミング、関数式プログラミングは宣言式プログラミングである。

  • オブジェクト向けプログラミングは、コマンドによってデータをどのように処理するかの問題を解決し、関数式プログラミングは、宣言関数によってどのような操作を実行すべきかを決定する.
    List<String> myList = Arrays.asList("c1", "a2", "b3", "4", "5");
    
    // 기존 방식
    for(int i = 0; i < myList.size(); i++){
        String s = myList.get(i);
        if(s.startsWith("c")){
            System.out.println(s.toUpperCase());
        }
    }
    // stream API를 이용한 방식 
    myList.stream()
            .filter(s -> s.startsWith("c"))
            .map(String::toUpperCase)
            .forEach(System.out::println);
    24172 stram APIを使用する方法から見ると、簡単に関数を宣言することで、データは私の望む方向に処理されています.
  • 2.関数プログラミングでは、関数は1レベルのオブジェクトでなければなりません。

  • 一級対象(一級公民、一級公民)
  • コンピュータプログラミング言語設計では、通常、他のオブジェクトに適用されるすべての演算をサポートするオブジェクトを指す.(何を言っているのかわかりませんが…)
  • は、他の要素と何の違いもないことを意味します.

  • 一級オブジェクトは、以下の条件を満たすオブジェクトです.
  • 変数またはデータ構造に含めることができる.
  • パラメータで渡すことができます.
  • の戻り値(戻り値)として使用できます.
  • アサイメントで使用される名前にかかわらず、固有の区別を行うことができます.
  • はコミッションを動的に割り当てることができます.(Property:プロパティ)
  • 既存データの不変性

  • 関数式プログラミングはコードの簡潔性を高めた.
  • ブログのサンプルコードを理解するためには、Ramda式とStreamを理解する必要があると思うので、Javaの定式ch 14 RamdaとStream部分を学びました.

    関数インタフェース(797 p)


  • 関数型インタフェースには抽象的な方法しかありません.

  • ラムダ式は匿名の対象であるため,ラムダ式を扱うためには参照変数が必要である.

  • この参照変数のタイプは、関数型インタフェースです.

  • しかし,関数インタフェースの方法とram多項式のパラメータ個数と戻りタイプは一致しなければならない.

  • 次の2つのコードをよく比較してみましょう.
    interface MyFunction {
    		int max (int a, int b);
    }
    
    public class Exam {
    		// MyFunction 인터페이스를 구현한 익명 객체 생성 
    		MyFunction f = new MyFunction() {
    						public int max(int a, int b) {
    								return a > b ? a : b;
    						}
    		};
    		int value = f.max(5, 3);   // 익명 객체의 메서드를 호출
    }

  • 上のコードはMyFunctionインタフェースを定義し,そのインタフェースを実現する匿名クラスのオブジェクトを生成する.
  • 匿名クラス:クラスの宣言とオブジェクトの作成を同時に行うための無名クラス(使い捨て)

  • 上記のコードはramdaフォーマットを使用して以下のように変更できます.
    @FunctionalInterface 
    interface MyFunction {
    		int max (int a, int b);
    }
    
    public class Exam {
    		MyFunction f = (a, b) -> a > b ? a : b;
    		int value = f.max(3, 5);
    }

  • コードが簡潔になりました.

  • ランダ式は匿名の対象です.

  • @FuncialInterfaceノイズを追加すると、コンパイラは関数インタフェースの条件を満たしているかどうかを確認します.

  • MyFunctionタイプの参照変数fは、ラムダ式を扱うための参照変数である.
  • 関数インタフェースタイプのパラメータと戻りタイプ(798 p)

  • パラメータは関数インタフェースです
  • メソッドのパラメータは、ランダ式
  • を受け入れることを示す.
  • 戻りタイプは関数インタフェース
  • このメソッドはramda式
  • を返すことを示す.
    @FunctionalInterface
    interface MyFunction {
        void run();
    }
    
    class LamdaEx1 {
        // 매개변수 타입이 MyFunction(함수형 인터페이스)인 메서드
        static void execute(MyFunction f) {
            f.run();
        }
        // 반환타입이 MyFunction(함수형 인터페이스)인 메서드
        static MyFunction getMyFunction() {
            return () -> System.out.println("f2.run()");
        }
    
        public static void main(String[] args) {
            // 람다식으로 MyFunction의 run() 구현
            MyFunction f1 = () -> System.out.println("f1.run()");
    
            MyFunction f2 = getMyFunction();
    
            f1.run();
            f2.run();
            System.out.println();
            execute(f1);
            execute(() -> System.out.println("run"));
        }
    }
    
    </> 실행 결과
    f1.run()
    f2.run()
    
    f1.run()
    run

  • static void execute(MyFunction f) {
    f.run();
    }
  • パラメータのタイプはMyFunction、すなわち関数型インタフェースである.
  • パラメータはラム茶食を受け入れることを示す
  • f.run();
    コール
  • ラムティー
  • ランダ式でexecuteと命名され、そのメソッドが呼び出されます.

  • static MyFunction getMyFunction() {
    return () -> System.out.println("f2.run()");
    }
  • 戻りタイプはMyFunction、関数インタフェース
  • このメソッドはramda式
  • を返すことを示す.

  • MyFunction f1 = () -> System.out.println("f1.run()");
  • MyFunctionインタフェースをram形式で実現するrun()

  • execute(() -> System.out.println("run"));
  • 部では、ラムダ式をパラメータとして受け入れるexecute()法のパラメータがラムダ式に組み込まれていることがわかる.
  • と書いてある郡
  • java.util.関数パッケージ(802 p)


    java.util.関数パッケージの一般的なフォーマットを関数インタフェースとして定義する方法

    条件式のPredicat

  • 戻りタイプboolean
  • 条件式をramda式として表すための
  • Predicate<String> isEmptyStr = s -> s.length() == 0;
    String s = "";
    
    if(isEmptyStr.test(s)){
        System.out.println("This is an empty String.");
     }

    2つのパラメータを持つ関数インタフェース

  • インタフェース名の前に「Bi」
  • があります.
  • Supplierはパラメータがなく、戻り値のみであり、メソッドは2つの戻り値を持つことができないため、BiSupplierは存在しない
    2つのパラメータ
  • を超える関数インタフェースが必要な場合は、
  • を作成して書き込む必要があります.

    UnaryOperatorとBinaryOperator

  • パラメータタイプと戻りタイプが一致する関数インタフェース
  • の祖先はFunctionとBiFunctionです

    ストリームAPI


    以下のブログレポートまとめ学習
    とてもよく整理されています
    ジャワ
  • Java Stream概要
  • 1)流れとは?

  • 関数を配列または集合インスタンスのデータストリームに組み合わせることで、必要な結果をフィルタし、加工結果を簡単に処理できます.

  • 従来の出力
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    public class StreamExam {
        public static void main(String[] args) {
            String[] strArr = {"data1", "data2", "data3"};
            List<String> strList = Arrays.asList(strArr);
    
            // 기존 방식, for문을 이용해 결과 출력
            Arrays.sort(strArr);
            Collections.sort(strList);
    
            for(String str : strArr){
                System.out.println(str);
            }
    
            for(String str : strList) {
                System.out.println(str);
            }
        }
    }

  • StreamAPIの使用
    // Stream API 사용
    strList.stream().sorted().forEach(System.out::println);
    Arrays.stream(strArr).sorted().forEach(System.out::println);
            
    // 람다식으로 표현
    strList.stream().sorted().forEach(x -> System.out.println(x));
    Arrays.stream(strArr).sorted().forEach(x -> System.out.println(x));

  • データ・ソース(配列またはリスト)からストリームを作成します.
    ソート()メソッドを呼び出してソートします.
    出力のためにforEach()メソッドを呼び出す
  • 今日やったこと


    学習
  • オブジェクト向けプログラミングと関数式プログラミングの違い(オブジェクト向けプログラミングはコマンドで実行し、関数式プログラミングは関数宣言で何を実行するかを決定する)
  • ram式を作成する方法です.関数インタフェースとは何ですか.ラムダ式の参照変数タイプは何ですか?パラメータと戻りタイプが関数インタフェースの場合?