Day16


ToDo

  • Java GUI学習(AWT)(O)
  • ランダ工部(O)
  • フローラーニング(X)
  • 1.ランダ


    JAvaはOOP言語ですが、jdk 1.8以降は関数型言語の機能が追加されています.

    1.1ラムティー

  • ラム多項式は、関数(方法)を単純な式として表す方法である.
  • 1.2ラムティーの作り方

  • メソッドの名前と戻りタイプを削除し、{}の前に"->"を追加します.
  • int max(int a, int b) {
      return a > b ? a : b;
    }
    
    (a, b) -> a > b ? a : b
    戻り値が
  • の場合は、戻り値
  • を省略することができる.
  • パラメータタイプは、
  • を省略することができる.
    (int a, int b) -> a > b ? a : b
    => (a, b) -> a > b ? a : b

    作成時の注意事項

  • パラメータの場合、カッコ()
  • を省略できます.
    (a) -> a * a
    => a -> a * a
  • ブロックに文が1つしかない場合は、
  • を省略(;加算しない)することができる.
    (int i) -> {
        System.out.println(i);
    }
    => (int i) -> System.out.println(i)
    🖐 カッコ内の1行の文がreturn文の場合、カッコは省略できません
    ⭕️
    (int i, int b) -> {
        return a + b;
    }(int i, int b) -> return a + b 
    ただし、上記では戻り値があれば、戻り文を省略できます.つまり、returnを付ける場合は中かっこ、returnを省略する場合は中かっこを省略することもできます.では、上のコードでは、次の文をこのように書き換えることができます.
    (int i, int b) -> a + b //매개변수 타입도 생략가능

    1.3ラムティーは匿名の対象

  • ラム多項式は匿名関数ではなく匿名オブジェクトである.
  • Javaの言語特性のため,関数のみに独立することはできず,クラス内部のメソッドとしてしか存在しない.したがって,ラムダ式は匿名クラスの(宣言と同時に生成されたクラス)オブジェクトと等しい.
    何でもラムダ式の方法なので、ラムダ式を呼び出すには参照変数が必要ですが、javaはこの参照変数のタイプを関数型インタフェースとして決定します.

    1.4関数インタフェース

  • 関数型インタフェースは、抽象的なメソッドのみを宣言するインタフェースである.
  • 2@FunctionalInterfaceのキーワードを追加すると、コンパイラは関数インタフェースが正しく記述されているかどうかを確認します.
  • ram多項式は、関数型インタフェースタイプの参照変数として使用することができる.すなわち,関数型界面はラムダ式の処理に用いられる.
  • //max라는 이름의 추상 메서드 하나만 선언되어있는 함수형 인터페이스
    @FunctionalInterface
    interface MyFunction {
      public abstract int max(int a, int b); 
    }
    
    //익명 클래스로 람다식을 구현했고, 참조변수의 타입은 MyFunction이라는 이름의 함수형 인터페이스 타입
    MyFunction f = new MyFunction {
      public int max(int a, int b) {
        return a > b ? a : b;
      }
    }
    
    int value = f.max(3,5); //5

    1.4.1 java.util.関数パッケージ


    このパッケージには、機能インタフェースが宣言されています.関数型インタフェースをパラメータとする方法を使用すると、Javaは、ユーザーが関数型インタフェースを定義するたびに、使用する必要がなく、一般的な機能を含む関数型インタフェースを入力するだけでパッケージを提供します.
    ちなみに、パケット内のインタフェースを表示すると、抽象的なメソッドが宣言されていないと判断できます.本来はラーメンインタフェースで抽象メソッドを宣言するしかなかったが、java 1.8バージョンからインタフェースでエラーメソッドと静的メソッドを宣言できるようになった.
    これらの方法により、2つ以上のラムティーを接続または実行するなど、複数のタスクを実行することができる.

    1.4.2集合フレームワークと関数インタフェース

    java.util.functionパッケージには、Predicatという関数インタフェースがあります.このインタフェースは、条件式をramda式として表すために使用されます.

    写真では、Predicatインタフェースはtestという抽象的なメソッドを宣言し、次のコードで使用できます.
    Predicate<String> isEmptyStr = s -> s.length() == 0;
    String s = "";
    
    if (isEmptyStr.test(s)) {
      System.out.println("빈 문자열입니다.");
    }
    以上のように、Predicateは、booleanの値を返すための条件付きフレームワークを提供する.
    ただし、集合フレームワークでは、これらの関数インタフェースも使用されます.例は次のとおりです.

    写真はCollectionレベルのremoveIfメソッドコードを切り取ります.removeIf方法は、パラメータによってPredicateを実装するオブジェクトを受信することを見ることができる.我々が作成したラムダ式のPredicate型匿名オブジェクトは,パラメータに移動し,条件式に従ってtrueをマッチングすると,要素のコードを削除する.
    このほか,IterableインタフェースのforEach(Consumer<T> action)など多くの方法でram式をパラメータとして用いているため,使用中にコード内の方法がどのような関数型インタフェースタイプであるかを調べることができる.

    1.4.3方法の参考

  • メソッドリファレンスはramda式をより簡潔に表す方法である.
  • ブルーダシは、1つの方法しか呼び出せない場合にのみ使用できます.
  • メソッドのみを呼び出すram式は、「クラス名::メソッド名」または「参照変数:::メソッド名」に変更できます.
  • import java.util.function.Function;
    
    public class MethodReferenceEx {
    
      public static void main(String[] args) {
        // 3. 원래 람다식은 s -> new MyClass(s) 인데,
        // Function<String, MyClass>를 통해 람다식의 매개변수의 타입과 리턴타입을 알 수 있으니 매개변수를 생략하고,
        // '클래스명::메서드명' 으로 변경해줄 수 있다. 이게 메서드 참조를 사용하는 방식.
        MyClass myClass = makeMyClass(MyClass::new); // = makeMyClass(s -> new MyClass(s));
        System.out.println("name is: " + myClass.getName()); // name is: method reference
    
      }
    
    
      // 1. makeMyClass란 메서드에 매개변수로 Function인터페이스 타입의 람다식을 받겠다고 작성했다.
      // 이 람다식은 String타입 매개변수를 받고, MyClass타입을 리턴한다.
      private static MyClass makeMyClass(Function<String, MyClass> lambda) {
        // 2. 람다식에 "method reference"이란 String 값을 인자로 전달한다.
        String name = "method reference";
        return lambda.apply(name);
      }
    }
    
    
    public class MyClass {
    
      String name;
    
      public MyClass(String name) {
        this.name = name;
      }
    
      public String getName() {
        return name;
      }
    }
    
    

    リファレンス

  • ジャワの晶石-南宮城